模板特化或函数重载

时间:2013-04-30 22:57:45

标签: c++ function templates overloading specialization

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

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

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

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) { ... }

..等等

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

我应该坚持功能超载吗?或者切换到模板专业化?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

这应该是你问题的答案:

how to get typeof variable in C++

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

答案 3 :(得分:0)

简短回答

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


长答案

  

功能基础模板专业化是2级公民,功能是一等公民。

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

如果您想要一个更好的问题以获得更好的答案,请阅读为什么不专门化功能模板?http://www.gotw.ca/publications/mill17.htm