1、类型相同判断
template< typename First, typename Second >
struct IsSame {
enum {
Result = 0
};
};
template< typename First >
struct IsSame< First, First > {
enum {
Result = 1
};
};
int main()
{
IsSame<int, string> a;
IsSame<string, string> b;
cout << a.Result << endl;
cout << b.Result << endl;
return 0;
}
输出:
0
1
2、数组类型判断
template< typename Type >
struct IsArray {
enum { Result = 0 };
};
template< typename Type, int32_t Count >
struct IsArray< Type[Count] > {
enum { Result = 1 };
};
template< typename Type >
struct IsArray< Type[] > {
enum { Result = 2 };
};
int main()
{
IsArray<int[]> a;
IsArray<int[3]> b;
IsArray<int> c;
cout << a.Result << endl;
cout << b.Result << endl;
cout << c.Result << endl;
return 0;
}
输出:
2
1
0
3、指针类型判断
template< typename TTYPE >
struct IsPtr {
enum { Result = 0 };
};
template< typename TTYPE >
struct IsPtr < TTYPE* > {
enum { Result = 1 };
};
template< typename TTYPE >
struct IsPtr <const TTYPE* > {
enum { Result = 2 };
};
template< typename TTYPE >
struct IsPtr < TTYPE*& > {
enum { Result = 3 };
};
template< typename TTYPE >
struct IsPtr < const TTYPE*& > {
enum { Result = 4 };
};
int main()
{
IsPtr<int> a;
IsPtr<int*> b;
IsPtr<const int*> c;
IsPtr<int*&> d;
IsPtr<const int*&> e;
cout << a.Result << endl;
cout << b.Result << endl;
cout << c.Result << endl;
cout << d.Result << endl;
cout << e.Result << endl;
return 0;
}
输出:
0
1
2
3
4
4、引用类型判断:
template< typename TTYPE >
struct IsRef {
enum { Result = 0 };
};
template< typename TTYPE >
struct IsRef< TTYPE& > {
enum { Result = 1 };
};
template< typename TTYPE >
struct IsRef< const TTYPE& > {
enum { Result = 2 };
};
int main()
{
IsRef<int> a;
IsRef<int&> b;
IsRef<const int&> c;
cout << a.Result << endl;
cout << b.Result << endl;
cout << c.Result << endl;
return 0;
}
输出:
0
1
2