Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板专门化或函数重载_C++_Function_Templates_Overloading_Specialization - Fatal编程技术网

C++ 模板专门化或函数重载

C++ 模板专门化或函数重载,c++,function,templates,overloading,specialization,C++,Function,Templates,Overloading,Specialization,我知道还有其他类似的问题,但它们不是很清楚 现在我觉得这是一个愚蠢的问题,因为我肯定我已经有了答案,但还是让我问吧 所以我基本上有一个函数,它接受一个字符串,然后根据适当的变量类型将其转换如下: template<class T> void ConvertValue(std::string str, T &variable) { variable = static_cast<T>(str); } 模板 void ConvertValue(std::str

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

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

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

template<class T>
void ConvertValue(std::string str, T &variable)
{
    variable = static_cast<T>(str);
}
模板
void ConvertValue(std::string str、T和变量)
{
变量=static_cast(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) { ... }
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&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;
}
模板
转换值(常量std::string和str)
{
标准:istringstream iss(str);
T-ret;
如果(!(iss>>ret))
{
抛出标准::错误抛出(“失败!”);
}
返回ret;
}

这应该是您问题的答案:


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

简短回答

你说得对。函数重载更有意义。函数基模板专用化不会过载


长答案

函数基模板专门化是类2公民,函数是一级公民

如果你写了一个重载函数,没有人可以写任何重载或隐藏你的代码而不会得到一个编译器错误。如果编写函数基模板专门化,任何人都可以使用与该函数基模板专门化签名匹配的函数重载来重载它。(是的,编写专门化的程序员会对您的函数感到恼火,但必须接受它)


如果您想得到更好的答案,请阅读“为什么不专门化函数模板?”

我不会假设通过val
std::string对任意类型的变量进行静态强制转换,甚至工作都是偶数,更不用说“很好”。但是,在strstream的帮助下,你可能会完成你想要的事情。这似乎是一件奇怪的事情。如果你说,把一个字符串转换成一个列表,你会期望发生什么。名单?每个条目包含一个字符串字符的列表?这将如何处理用户创建的对象?似乎stringstream应该处理标准整数、浮点等。。。如果需要,可以使用模板化容器版本。但是您希望在这里实现什么呢?+1表示如果代码重用是主要目标,建议使用模板。