我想为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
答案 0 :(得分:2)
您指定了一个主模板,它带有三个参数(str
,pos
和base
),但您尝试使用仅带一个参数的函数模板对其进行专门化。显然,这不起作用:专业化需要匹配主要模板。
功能模板的部分特化不支持[尚?]。如果您需要部分专用的函数模板,则需要间接进行部分特化:您将委托给类模板并部分专门化。类模板可能只有一个static
函数。当然,在您的示例中,您不使用部分专业化而是使用完全专业化。
答案 1 :(得分:2)
首先,您必须使非专业模板函数完全模板化。这意味着您必须返回类型T
。我还建议这种非专业功能除了返回之外没有任何其他功能。 T()
(因为它不专业,不知道要调用什么函数)。
要继续,to_numeric<float>
特化需要与非专用函数具有相同的参数,因此您需要添加虚拟base
参数。