Я только что попробовал эквивалент в режиме g ++ 4.5 C ++ 0x для массивов символов, и он не позволит мне определить
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);
}
Он правильно получает размер массива, если передан, и указателя, если передан, но я не могу использовать moresilly, чтобы различать указатель и массив, поэтому я не могу отличить массив из 4 символов от указателя на n символов.
Это может работать, вроде как, иметь шаблоны для 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]", она не будет работать, никогда ничего не сопоставляя.
Итак, я решил вашу проблему, но не ожидаю, что это сработает в других версиях компилятора, включая будущие. Вот почему я ненавижу с ++. Каким-то образом определение языка настолько неясно, что компиляторы полны нестабильных краевых случаев.
Это полезный трюк, но я могу его использовать.