2013-04-30 112 views
0

我知道还有其他类似的问题,但他们不是很清楚。模板专业化或功能超载

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

所以我基本上有一个函数,它在一个字符串,然后基于它转换它,像这样适当的变量类型:

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

因此这似乎是罚款是否正确?但事情是,你不能转换一个字符串来说一个int或一个浮点数,所以我将不得不为整数和浮点数和其他类型,它不能转换为模板特化,所以我问的是我应该是这样的:

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

...等

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

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

+1

我不会假设static-casting一个by-val的'std :: string'到任意一个带有* work *的类型变量,更不用说“很好”。但是你可以在strstream的帮助下完成你想要的任务。 – WhozCraig 2013-04-30 23:01:32

+0

这似乎是一件奇怪的事情。如果你说,将字符串转换为列表,你会发生什么?清单?一个列表与每个条目的字符串之一?这将如何处理用户创建的对象?似乎stringstream应该照顾标准整数,浮点数等......如果需要的话,也许是模板化的容器版本。但是你希望在这里完全达到什么目的? – 2013-04-30 23:03:09

回答

1

如果函数的内部将不得不为每个类型不同而且可能包含类型检查,那么只有多个函数会更简单和更清晰。

另一方面,如果您有一堆带有toString()方法的类进行转换。那么你会使用一个模板,因为内部将永远是相同的。

+0

+1表示如果代码重用是主要目标,则建议使用模板。 – 2013-04-30 23:03:37

+0

好吧,我认为非常感谢您的澄清 – CodingMadeEasy 2013-04-30 23:05:01

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; 
} 
0

简短的回答

你是对的。函数重载更有意义。功能库模板专业化不会超载


长的答案

功能基本模板专业有2类公民,函数是一等公民。

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

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