//通过typeid,普通函数参数匹配,模板函数匹配,测试vc6, vc8, devc++(mingw3.4.2)对类型的处理情况(类型的转换)
#include <iostream>
#include <typeinfo>
using namespace std;
/*实际需要的参数类型:T*/
template <typename T>
int compare(const T&, const T& t2)
{return 1;}
/*实际需要的参数类型:const char * */
template<>
int compare<const char*>(const char* const&, const char* const&)
{return 2;}
/*实际需要的参数类型:const char * */
int compare(const char* const&, const char* const&)
{return 3;}
int main(void)
{
const char arr[] = "";
char arr1[] = "";
const char* t = "";
char * t1 = "";
/*vc8
cout << compare(arr, arr) << endl; //3, 1, 1
cout << compare(arr1, arr1) << endl;//3, 1, 1
cout << compare("", "") << endl; //3, 1, 1
cout << compare(t, t) << endl; //3, 2, 1
cout << compare(t1, t1) << endl; //1, 1, 1
cout << typeid(arr).name() << endl; //char const [1]
cout << typeid(arr1).name() << endl;//char [1]
cout << typeid("").name() << endl; //char const [1]
cout << typeid(t).name() << endl; //char const *
cout << typeid(t1).name() << endl; //char *
第一次,有函数存在:
char const [1] 和 char [1] 成功转换为 char const *
第二次,模板和全特化共存:
char const [1], char 为实际类型, 匹配到T
*/
/*devc++(mingw3.4.2)
cout << compare(arr, arr) << endl; //3, 1, 1
cout << compare(arr1, arr1) << endl;//1, 1, 1
cout << compare("", "") << endl; //3, 1, 1
cout << compare(t, t) << endl; //3, 2, 1
cout << compare(t1, t1) << endl; //1, 1, 1
cout << typeid(arr).name() << endl; //A1_c
cout << typeid(arr1).name() << endl;//A1_c
cout << typeid("").name() << endl; //A1_c
cout << typeid(t).name() << endl; //PKc
cout << typeid(t1).name() << endl; //Pc
第一次,有函数存在:
char const [1] 成功转换为 char const *
char [1] 还是 char [1]
第二次,模板和全特化共存:
char const [1], char 为实际类型, 匹配到T
*/
/*vc6
cout << compare(arr, arr) << endl; //1, 1, 1
cout << compare(arr1, arr1) << endl;//1, 1, 1
cout << compare("", "") << endl; //1, 1, 1
cout << compare(t, t) << endl; //2, 2, 1
cout << compare(t1, t1) << endl; //1, 1, 1
cout << typeid(arr).name() << endl; //char const *
cout << typeid(arr1).name() << endl;//char *
cout << typeid("").name() << endl; //char [1]
cout << typeid(t).name() << endl; //char const *
cout << typeid(t1).name() << endl; //char *
VC6对类型的处理混乱...
*/
/*
结论:
个人以为devc++(mingw)对类型的处理结果最合理!
*/
cin.get();
return 0;
}