Чтобы снять загромождение кода с вызовов strtoxx, но при этом сделать их встроенными, я хотел бы иметь шаблон функции, например:
template <typename STR_TO_NUM> static auto StrToNum( const string& s ) {
char* pEnd;
return STR_TO_NUM( s.c_str(), &pEnd, 10 );
}
И называть это как
unsigned long x = StrToNum<strtoul>( "1984" );
Однако я получаю «ошибка вывода / замены аргумента шаблона: ошибка». Я могу сделать:
template <typename T, T (*STR_TO_NUM)(const char *, char **, int)> static T StrToNum( const string& s ) {
char* pEnd;
return STR_TO_NUM( s.c_str(), &pEnd, 10 );
}
И укажите тип возврата при вызове. Но кажется, что это излишне. Есть ли способ избежать этого?
Я пытался ‘template typedef’ STR_TO_NUM используя ‘using’ в C ++ 11, но не мог понять, как это сделать для типов функций.
Спасибо
STR_TO_NUM
в вашем первом примере это тип. Вы передаете strtoul
это функция. Вы можете попробовать что-то вроде:
template <typename STR_TO_NUM> static auto StrToNum( const string& s, STR_TO_NUM strToNum ) {
char* pEnd;
return strToNum(s.c_str(), &pEnd, 10 );
}
и назовите это как:
unsigned long x = StrToNum( "1984", strtoul );
C ++ 1z будет иметь
template <auto STR_TO_NUM>
static auto StrToNum(const string& s) {
char* pEnd;
return STR_TO_NUM( s.c_str(), &pEnd, 10 );
}
вместо
template <typename T, T STR_TO_NUM>
static auto StrToNum(const string& s) {
char* pEnd;
return STR_TO_NUM( s.c_str(), &pEnd, 10 );
}
И его
StrToNum<decltype(&strtoul), &strtoul>("1984");