我想为std::stoi,std::stof,std::stod等创建通用函数。例如:

// std::string -> int
std::string str = "1000000";
int i = to_numeric<int>(str);

// std::string -> long
std::string str = "100000000000";
long i = to_numeric<long>(str);

// std::string -> float
std::string str = "10000.1";
float i = to_numeric<float>(str);

但是我不知道如何进行部分特化:
template<class T>
int to_numeric(const std::string &str, size_t *pos = 0, int base = 10) {
    return std::stol(str, pos, base);
};

template<>
long to_numeric<long>(const std::string &str, size_t *pos, base) {
    return std::stol(str, pos, base);
};

template<>
float to_numeric<float>(const std::string &str, size_t *pos) {
    return std::stof(str, pos);
};
// .....

错误:
to_numeric.cpp:76:79: error: default argument specified in explicit specialization [-fpermissive]
to_numeric.cpp:76:12: error: template-id 'to_numeric<float>' for 'float to_numeric(const string&, size_t*)' does not match any template declaration
make: *** [build] Error 1

最佳答案

您指定一个主模板,该主模板带有三个参数(strposbase),但是您尝试使用仅带有一个参数的函数模板对其进行专门化。显然,这是行不通的:特化需要匹配主模板。

[尚不支持]功能模板的部分特化。如果需要部分特化的功能模板,则需要间接进行部分特化:您将委托(delegate)给一个类模板,并对它进行部分特化。类模板可能只有一个static函数。当然,在您的示例中,您不会使用部分特化,而是使用完全特化。

09-06 22:56
查看更多