2013-04-30 3 views
0

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

Теперь я чувствую, что это глупый вопрос, потому что я уверен, что у меня уже есть ответ, но позвольте мне спросить в любом случае.

Так что я в основном имеет функцию, которая принимает в строке, а затем на основе соответствующего типа переменного он преобразует его следующим образом:

template<class T> 
void ConvertValue(std::string str, T &variable) 
{ 
    variable = static_cast<T>(str); 
} 

так это, кажется, хорошо правильно? Но дело в том, что вы не можете преобразовать строку, чтобы сказать int или float, поэтому мне пришлось бы делать специализированную специализацию для int и float, а для других типов, которые она не может преобразовать, так что я спрашиваю, должен ли я что-то вроде этого:

void ConvertValue(std::string str, int &variable) { variable = atoi(str.c_str()); } 
void ConvertValue(std::string str, float &variable) { ... } 
void ConvertValue(std::string str, double &variable) { ... } 
void ConvertValue(std::string str, std::vector<int> &variable) { ... } 

..etc

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

Должен ли я придерживаться функции перегрузки? Или переключиться на специализированную специализацию?

+1

Я бы не стал статическим литьем по-val 'std :: string' в произвольную типизированную переменную с четным * work *, а тем более -« отлично ». Но вы, вероятно, можете выполнить то, что хотите, с помощью какой-либо помощи. – WhozCraig

+0

Кажется странным. Что бы вы ожидали, если вы скажете, преобразовали строку в список. A ? Список с каждой записью один из строк символов? Как это будет обрабатывать созданные пользователем объекты? Кажется, что stringstream должен заботиться о стандартном ints, float и т. Д. Возможно, вам понадобится шаблонная версия контейнера. Но чего вы надеетесь достичь именно здесь? –

ответ

1

Если внутренние функции функции будут отличаться для каждого типа и могут включать проверки типов, проще и чище просто иметь несколько функций.

Если, с другой стороны, у вас была группа классов с методом toString() для преобразования. Затем вы будете использовать шаблон, потому что внутренности всегда будут одинаковыми.

+0

+1 за предложение использовать шаблон, если основной целью является повторное использование кода. –

+0

Хорошо, я так и благодарен за разъяснения – CodingMadeEasy

0

Я хотел бы использовать std::istringstream:

template <typename T> 
T ConvertValue(const std::string& str) 
{ 
    std::istringstream iss(str); 

    T ret; 
    if (!(iss >> ret)) 
    { 
     throw std::bad_cast("Failed!"); 
    } 

    return ret; 
} 
0

Короткий ответ:

Вы правы. Функция Перегрузка имеет больше смысла. Специальная спецификация базового шаблона не перегружает.


Длинный ответ

функции базового шаблона специализации класса 2 гражданина, функции первого класса гражданина.

Если вы пишете перегруженную функцию, никто не может написать что-либо перегружающее или скрывающее ваш код, не получая ошибку компилятора.Если вы напишете функциональный базовый шаблон специализации, любой может перегрузить его с помощью функции перегрузки, соответствующей этому функция базовый шаблон специализации подпись. (да, программист, пишущий специализацию, будет злиться на вашу функцию, но ему придется жить с этим).

Если вам нужен лучший вопрос для лучшего ответа, прочитайте Почему не специализируются шаблоны функций?: http://www.gotw.ca/publications/mill17.htm

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