前面博客提到了如何判断T为内建数据类型,这篇博客将会进一步介绍如何确定内建数据类型的哪种具体类型
下面是具体的代码实现:
#include <iostream>
#include <string>
using namespace std;
//判断参数是否为内建类型(基本类型)
//基本模板,一般情况下T不是基本类型
template <typename T>
class IsFundaT {
public:
enum { Yes=0, No=1 , IsFloatingT=0 };
};
//基本模板,一般情况下不是float类型
template <typename T>
class IsFloatingT {
public:
enum { Yes=0, No=1};
};
//...其他的内建类型的具体类型基本模板
//用于特化基本类型的宏
#define MK_FUNDA_TYPE(T) \
template<> class IsFundaT<T> { \
public: \
enum { Yes=1, No=0, IsFloatingT = IsFloatingT<T>::Yes }; \
}; \
//特化内建类型的float的类型
template <>
class IsFloatingT<float> {
public:
enum { Yes=1, No=0};
};
//...其他的内建类型的具体类型的特化版本
//内建类型的具体特化
MK_FUNDA_TYPE(void)
MK_FUNDA_TYPE(bool)
MK_FUNDA_TYPE(char)
MK_FUNDA_TYPE(signed char)
MK_FUNDA_TYPE(unsigned char)
MK_FUNDA_TYPE(wchar_t)
MK_FUNDA_TYPE(signed short)
MK_FUNDA_TYPE(unsigned short)
MK_FUNDA_TYPE(signed int)
MK_FUNDA_TYPE(unsigned int)
MK_FUNDA_TYPE(signed long)
MK_FUNDA_TYPE(unsigned long)
#if LONGLONG_EXISTS
MK_FUNDA_TYPE(signed long long)
MK_FUNDA_TYPE(unsigned long long)
#endif //LONGLONG_EXISTS
MK_FUNDA_TYPE(float)
MK_FUNDA_TYPE(double)
MK_FUNDA_TYPE(long double)
//以下为测试程序
template <typename T>
void test(const T& t){
if(IsFundaT<T>::Yes){
if(IsFundaT<T>::IsFloatingT){
cout<<"T is floating" <<endl;
}else{
cout<<"T is fundamental type but is not floating" <<endl;
}
}else {
cout<<"T is not fundamental type" <<endl;
}
}
class MyType{
};
int main(int argc, char *argv[]){
test(7);
test((float)7.1); //7.1默认是dobule类型
test(MyType());
return 0;
}