0

我知道还有其他类似的问题,但不是很清楚。

现在我觉得这是一个愚蠢的问题,因为我确定我已经有了答案,但还是让我问吧。

所以我基本上有一个函数,它接受一个字符串,然后根据适当的变量类型将它转换成这样:

template<class T>
void ConvertValue(std::string str, T &variable)
{
    variable = static_cast<T>(str);
}

所以这似乎很好对吗?但问题是您不能将字符串转换为 int 或 float,因此我必须对 int 和 float 以及它无法转换为的其他类型进行模板专业化,所以我要问的是我应该有像这样的东西:

void ConvertValue(std::string str, int &variable) { variable = atoi(str.c_str()); }
void ConvertValue(std::string str, float &variable) { ... }
void ConvertValue(std::string str, double &variable) { ... }
void ConvertValue(std::string str, std::vector<int> &variable) { ... }

..ETC

还是我应该使用模板专业化?哪个更有意义?我倾向于函数重载,因为大多数类型都有自己的转换函数,所以因为它们略有不同,所以函数重载对我来说是合乎逻辑的,但我不知道我是否遗漏了什么。

我应该坚持函数重载吗?还是切换到模板专业化?

4

4 回答 4

1

如果函数的内部对于每种类型都必须不同,并且可能包括类型检查,那么只有多个函数会更简单、更清晰。

另一方面,如果您有一堆带有 toString() 方法的类进行转换。然后你会使用一个模板,因为内部总是一样的。

于 2013-04-30T23:01:21.727 回答
0

我会使用std::istringstream

template <typename T>
T ConvertValue(const std::string& str)
{
    std::istringstream iss(str);

    T ret;
    if (!(iss >> ret))
    {
        throw std::bad_cast("Failed!");
    }

    return ret;
}
于 2013-04-30T23:04:11.440 回答
0

这应该是您问题的答案:

如何在 C++ 中获取 typeof 变量

是的,它应该是模板专业化。

于 2013-04-30T23:06:18.900 回答
0

简短的回答

你说的对。函数重载更有意义。函数基模板特化不会重载


长答案

函数基模板特化是类 2 公民,函数是一等公民。

如果您编写重载函数,没有人可以编写任何重载或隐藏代码而不会出现编译器错误的内容。如果您编写函数基模板特化,任何人都可以使用与该函数基模板特化签名匹配的函数重载来重载它。(是的,编写专业化的程序员会对你的函数感到生气,但必须忍受)。

如果您想要一个更好的问题以获得更好的答案,请阅读Why Not Specialize Function Templates?: http://www.gotw.ca/publications/mill17.htm

于 2013-05-15T14:40:09.477 回答