我想知道以下方法之间的主要区别是什么。如果定义了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;
}
是否应该首选上述哪一种?
答案 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)。