为了使代码从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 );
}


并在调用时指定返回类型。但这感觉是多余的。有办法避免吗?

我试图在C ++ 11中使用'using'来'typedef'STR_TO_NUM',但无法弄清楚如何为函数类型做到这一点。

谢谢

最佳答案

第一个示例中的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 );

09-25 18:42