对模板的重载,两个函数模板分别获得对象对应的字符串或者对应的指针的值和指针所指对象的值.
template<typename T>
string debug_rep(const T& t)
{
ostringstream ret;
ret << t;
return ret.str();
}
template<typename T>
string debug_rep(T* p)
{
ostringstream ret;
ret << p;
if (p)
ret << " " << debug_rep(*p);
else
ret << "null pointer";
return ret.str();
}
int main()
{
string s("hi");
char c[] = { 'I','a','m' };
cout<<debug_rep(c);
return 0;
}
多个可行模板,将选择更加特例化的版本.这是因为const T&理论上可以任何类型,我们无法将它与const T*区分开来.例如:
string s("hi");
const string* sp = &s;
cout<<debug_rep(sp);
非模板和重载
string debug_rep(const string&s)
{
return '"' + s + '"';
}
int main()
{
string s("hi");
const string* sp = &s;
cout<<debug_rep(s);
return 0;
}
重载模板和类型转换.当我们使用c类型的字符串指针时,对于版本1不会发生数组到指针的转换(引用),T被绑定到char[],对于版本2发生转换,则T被绑定到const char.这会发生一次类型转换,这种转换时被认为精确匹配的.而第三种则不是精确匹配.根据特例化的规则,会选择第二个.