#include <iostream>
using namespace std;
//一些模板練手時的小應用辨別基本類型和自訂類型
//使用方法就是便舉有限的基本類型,無他
//基本類模板枚舉非基本類型
template < typename T>
class IsFoundationType
{
public:
enum{ Yes = 0, No = 1 };
};
//宏定義MACRO_FOUNDATION_TYPE(T)特化依次調用特化所有
//基礎資料型別 (Elementary Data Type)枚舉為Yes = 1
#define MACRO_FOUNDATION_TYPE(T) /
template<> class IsFoundationType<T> /
{ /
public: /
enum{ Yes = 1, No = 0 }; /
}; /
//使用宏進行特化以便得到最特殊的執行個體點
MACRO_FOUNDATION_TYPE(void)
MACRO_FOUNDATION_TYPE(bool)
MACRO_FOUNDATION_TYPE(char)
MACRO_FOUNDATION_TYPE(unsigned char)
MACRO_FOUNDATION_TYPE(wchar_t)
MACRO_FOUNDATION_TYPE(short)
MACRO_FOUNDATION_TYPE(signed int)
MACRO_FOUNDATION_TYPE(unsigned int)
MACRO_FOUNDATION_TYPE(signed long)
MACRO_FOUNDATION_TYPE(unsigned long)
#if LONGLONG_EXISTS
MACRO_FOUNDATION_TYPE(signed long long)
MACRO_FOUNDATION_TYPE(unsigned long long )
#endif
MACRO_FOUNDATION_TYPE(double)
MACRO_FOUNDATION_TYPE(float)
MACRO_FOUNDATION_TYPE(long double)
//測試的函數模板,可以看看非常簡單但是這種思想
//還是比較有用,窮舉有限數目匹配。
template <typename T>
void test( T const& t )
{
if( IsFoundationType<T>::Yes )
{
cout<<"T is fundamental type"<<endl;
}
else
{
cout<<"T isn't fundamental type"<<endl;
}
if( IsDouble<T>::Yes )
{
cout<<"T is double type"<<endl;
}
else
{
cout<<"T isn't double type"<<endl;
}
}