我刚刚在 g++ 4.5 C++0x 模式下尝试了 char 数组的等效项,但它不会让我同时定义
template <typename T>void moresilly(const T v[],const char *description)
与
template <typename T>void moresilly(const T *v,const char *description)
它声称两者是同一类型。
我有一个函数:
template <typename T>void silly(const T & v,const char *description)
{
cout<<"size of "<<description<<" is "<< sizeof(T)<<endl;
moresilly(v,description);
}
如果通过,它会正确获取数组的大小,如果通过,它会正确获取指针的大小,但是我不能更傻地使用来区分指针和数组,所以我不能从指向 n 个字符的指针中分辨出 4 个字符的数组。
在 T[1]、T[2]、T[3] 等上有模板可能会起作用,但是已经有一篇文章说不同的编译器以不同的方式处理(或一些类似的情况),并且gnu 更喜欢 C++11 中的指针匹配。
... 稍后添加:
经过一些实验,我发现了一些在 g++ 4.5 中有效的东西
template <typename T,size_t L>void moresilly(const T (&v)[L],const char *description)
{
cout<<description<<" is an array"<<endl;
}
template <typename T>void moresilly(const T *v,const char *description)
{
cout<<description<<" is a pointer"<<endl;
}
template <typename T>void moresilly(const T v,const char *description)
{
cout<<description<<" is a raw value"<<endl;
}
template <typename T>void silly(const T & v,const char *description)
{
cout<<"size of "<<description<<" is "<< sizeof(T)<<endl;
moresilly(v,description);
}
以下工作正常
silly("12345","immediate string of 5 characters plus zero");
silly((const char *)"12345","immediate constant char pointer of 5 characters plus zero");
char testarray[]="abcdef";
silly(testarray,"char array of 6 characters plus zero");
const char testarray2[]="abcdefg";
silly(testarray2,"const char array of 7 characters plus zero");
请注意,如果第一个函数是用“const T v[L]”而不是“const T (&v)[L]”定义的,它将不起作用,永远不会匹配任何东西。
所以我解决了您的问题,但不要指望这可以在其他版本的编译器中工作,包括未来的编译器。这就是我讨厌 c++ 的原因。不知何故,该语言的定义如此不清楚,以至于编译器充满了不稳定的边缘情况。
这是一个有用的技巧,我可能会使用它。