欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类型萃取&类的模板特化

程序员文章站 2022-06-10 14:44:17
...

类模板的特化

1、全特化
2、偏特化(局部特化)

1、全特化

template <>
class Data<int, char>
{
public :
    Data()
    {
        cout<<"Data(int, char)"<<endl;
    }

private :
    int _d1 ;
    char _d2 ;
};

2、偏特化(局部特化)

偏特化分为两种

1特化部分参数

template <class T1>
class Data<T1, double>
{
public :
    Data()
    {
        cout<<"Data(T1, double)"<<endl;
    }

private :
    T1 _d1 ;
    char _d2 ;
};

2.参数指定特定类型

template <class T1, class T2>
class Data<T1*, T2*>
{
public :
    Data()
    {
        cout<<"Data(T1*, T2*)"<<endl;
    }

private :
    T1 _d1 ;
    T2* _d2 ;
};
template <class T1, class T2>
class Data<T1&, T2&>
{
public:
    Data(const T1& d3)
        :_d3(d3)
    {
        cout << "Data(T1&, T2&)" << endl;
    }

private:
    T1* _d1;
    T2* _d2;
    const T1& _d3;
    //T2& _d4;引用必须初始化
};

特化可以说就是模板的一种特殊化

所以模板的全特化和偏特化都是在已定义的模板基础之上,不能单独存在。

void test()
{
    Data<int, int> d1;
    Data<int, char> d2;
    Data<int, double> d3;
    Data<int*, double*> d4;
    Data<int*, int*> d5;
    Data<int&, int&> d6(10);
}

类型萃取&类的模板特化

类型萃取

template<class T>
struct __TypeTraits
{
    typedef __FalseType IsPODType; // 内嵌重定义
};

template<>
struct __TypeTraits<int>
{
    typedef __TrueType IsPODType; 
};

类型萃取&类的模板特化

template<>
struct __TypeTraits<char>
{
    typedef __TrueType IsPODType; 
};

template<>
struct __TypeTraits<double>
{
    typedef __TrueType IsPODType; 
};

这里我们用顺序表copy时,对于不同类型,不同的拷贝方式来举例

template<class T>
T* __TypeCopy(T* dst, const T* src, size_t n, __TrueType)
{
    // int 、char...
    cout<<"memcpy"<<endl;
    return (T*)memcpy(dst, src, n*sizeof(T));
}

template<class T>
T* __TypeCopy(T* dst, const T* src, size_t n, __FalseType)
{
    // string
    cout<<"for+operator="<<endl;
    for (size_t i = 0; i < n; ++i)
    {
        dst[i] = src[i]; // operator=
    }

    return dst;
}
template<class T>
T* TypeCopy(T* dst, const T* src, size_t n)
{
    return __TypeCopy(dst, src, n, __TypeTraits<T>::IsPODType());
}

类型萃取&类的模板特化

相关标签: c++ 类型萃取