只有一个模板专业化有用吗?

时间:2017-09-15 09:41:57

标签: c++ c++11 templates tostring template-specialization

我想知道以下方法之间的主要区别是什么。如果定义了std::to_string,是否存在两个中的一个会导致问题?

include <string>
using namespace std;


enum class eColor
{
   Red
};

void to_string(eColor color)
{
}

template<typename C = eColor)
void to_string(C color)
{
}



int main()
{
   to_string(eColor::Red); // assume only one of the above is defined
   return 0;
}

是否应该首选上述哪一种?

2 个答案:

答案 0 :(得分:1)

你的函数to_string(eColor颜色)实际上并不是模板特化,因为它错过了模板&lt;&gt;在定义之前。因此编译器将其视为完全定义的函数,而不是使用具体类型生成的模板。这意味着只要编译器可以匹配参数列表,就会始终使用此函数。

答案 1 :(得分:0)

尽管您使用指令对名称空间造成了不必要的污染,但如果您计划使用to_string这样的名称,则会特别奇怪:

模板函数自动推导出他们的模板参数。所以以下内容绝对有效:

int main(int argc, const char * argv[]) {
    to_string(eColor::Red);
    to_string("Hey");
    to_string(42);
    return 0;
}

因此,如果你真的计划为一个专用类型设置你的功能,那么你会遇到一些非常有趣的错误消息,甚至更糟糕的是没有错误信息和不需要的行为。

功能版本至少可以防止一些错误的情况。 (虽然存在隐式转换,但仍会接受42)。