模板:如何判断模板参数T为内建数据类型(2)

来源:互联网 发布:广州seo建站 编辑:程序博客网 时间:2024/05/11 21:11

前面博客提到了如何判断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;
}

0 0
原创粉丝点击