c++ - 模板特化或函数重载

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

..等等

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

我应该坚持使用函数重载吗?或者切换到模板特化?

最佳答案

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

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

关于c++ - 模板特化或函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310281/

相关文章:

c - 这个函数怎么写 C

javascript - 在 React 和 JSX 中对数组值的单个索引进行排序

c++ - 构造函数中的初始化列表可以在模板类中使用吗?

c# - 使用 C++/MFC 和 C# 中的插件扩展 C++/MFC 应用程序

c++ - 类型转换是如何工作的?

c++ - 使用扩展 POSIX 语法的 C 正则表达式与 C++ 正则表达式中的不同行为

python - 将 2 个 python 类对象添加在一起

c++ - 如何检索文件数字签名信息?

使用 SFINAE 的 C++ 好友模板

模板类中的 C++ 非专用成员