2009-02-06 2 views
0

Ниже код используется для получения std :: string Представление из кода ASCII.Создание шаблона метода - C++

string Helpers::GetStringFromASCII(const int asciiCode) const 
{ 
    return string(1,char(asciiCode)); 
} 

Это хорошо работает. Но в моем приложении я знаю коды ASCII во время компиляции. Так что я буду называть его как

string str = GetStringFromASCII(175) // I know 175 at compile time 

Вопрос

Есть ли способ сделать GetStringFromASCII метод шаблон, что обработка происходит во время компиляции, и я могу избежать вызова функции каждый раз при во время выполнения.

Любые мысли?

+0

что вы действительно хотите? шаблон выкупит вам ноль. вы скорее увеличите размер исполняемого файла, если вам повезет, и вы не сможете передавать значения времени выполнения. я бы сказал, что это –

+0

Остерегайтесь, ASCII ограничен [0; 127], 175 не является символом ASCII. –

ответ

0

Как о чем-то вроде этого:

#include <iostream> 
#include <string> 

using namespace std; 

template <int asciiCode> 
inline string const &getStringFromASCII() 
{ 
    static string s(1,char(asciiCode)); 
    return s; 
} 

int main(int, char const**) { 
    cout << getStringFromASCII<65>() << endl; 
} 

EDIT: возвращает реф Теперь

+0

Вы получаете практически нулевую выгоду от этого. Тип символа «char» все еще и происходит во время выполнения, и вызывает вызов конструктора строк. –

+0

Спасибо за ответ. Почему вы использовали статическую? Что не так, просто вернув строку? –

+0

В вашем коде, я думаю, getStringFromASCII не вызывается всегда. Компилятор будет создавать специализацию и использовать это, верно? –

3

Вместо кормления ИНТ константа функции преобразования строки, используйте строку константа непосредственно:

string str("\xAF"); // 0xAF = 175

Кстати, за исключением высоких требований к производительности в цикле, чтение торгового кода для некоторых циклов ЦП редко является эффективным в целом.

+0

Это выглядит просто. Но, как сказал Фредерик, похоже, что я не получу никакой пользы здесь, если я буду использовать шаблоны. –

+0

Да, вы правы, если вы действительно хотите повысить производительность, используйте либо static const string STRING_175 ("\ xAF"); , то ссылайтесь на переменную const или используйте const char * str = "\ xAF" , который при необходимости будет выливаться в std :: string – jturcotte

+0

На самом деле - это медленнее! Ему нужно сделать strlen на «\ xAF». – MSalters

4

Этот вид метапрограммного программирования хорошо работает, когда вы имеете дело с примитивными типами данных, такими как int s и float s. Если вам необходим строковый объект, вы не можете избежать вызова конструктора std::string, и во время компиляции это невозможно. Кроме того, я не думаю, что вы можете перетащить бросок на char, чтобы скомпилировать время, что в целом означает, что шаблоны не могут помочь вам здесь.

+0

Спасибо за ответ. Да, я получил, что шаблоны здесь не нужны. –

0

Почему вы даже беспокоитесь о вспомогательной функции?

string s(1, char(175)); 

Это все, что вам нужно, и это самое быстрое, что вы собираетесь получить.

Смежные вопросы