[英]Template Specialization or Function Overloading
我知道还有其他类似问题,但它们不是很清楚。
现在,我觉得这似乎是一个愚蠢的问题,因为我确定我已经有了答案,但是无论如何我还是要问。
所以我基本上有一个函数,它接收一个字符串,然后根据适当的变量类型将其转换为:
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()方法进行转换的类。 然后,您将使用模板,因为内部构造将始终相同。
我会用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类公民,功能是1类公民。
如果编写重载函数,则任何人都无法编写任何重载或隐藏代码而不会出现编译器错误的情况。 如果编写函数基础模板专业化,则任何人都可以使用与该函数基础模板专业化签名相匹配的函数重载对其进行重载。 (是的,写专业化的程序员会很讨厌您的功能,但必须忍受这一点)。
如果您想要一个更好的问题以获得更好的答案,请阅读为什么不专门研究功能模板? : http : //www.gotw.ca/publications/mill17.htm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.