6

我想为 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
4

2 回答 2

2

您指定了一个带有三个参数( 、 和 )的主模板,strposbase尝试使用只带一个参数的函数模板来专门化它。显然,这是行不通的:专业化需要匹配主模板。

[还没有?] 支持函数模板的部分特化。如果您需要一个部分特化的函数模板,您需要间接地进行部分特化:您将委托给一个类模板并对其进行部分特化。类模板可能只有一个static功能。当然,在您的示例中,您不使用部分专业化而是完全专业化。

于 2012-11-04T18:56:37.903 回答
2

首先,您必须使非专用模板函数完全模板化。这意味着您必须设置返回类型T。我还建议这个非特化函数除了 return eg 之外什么都不做T()(因为它不是特化的并且不知道要调用什么函数)。

要继续,特化to_numeric<float>需要与非特化函数具有相同的参数,因此您需要添加虚拟base参数。

于 2012-11-04T18:57:04.687 回答