Как «помочь» компилятору вывести тип возврата шаблона функции из параметра шаблона, который является функцией?

Чтобы снять загромождение кода с вызовов 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, но не мог понять, как это сделать для типов функций.

Спасибо

0

Решение

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 );
6

Другие решения

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");
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector