如何帮助'编译器从函数模板参数中推导出函数模板返回类型?

时间:2016-10-28 15:23:06

标签: c++ c++11 templates argument-deduction

要从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" );

但是我得到的模板参数扣除/替换失败了:&#39;错误。我能做到:

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

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

我试过&#39;模板typedef&#39; STR_TO_NUM使用&#39;使用&#39;在C ++ 11中,但无法弄清楚如何为函数类型做到这一点。

由于

2 个答案:

答案 0 :(得分:6)

第一个示例中的

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

答案 1 :(得分:2)

C ++ 17有:

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