指针专用模板

时间:2013-02-11 04:56:41

标签: c++ pointers template-specialization

我想专门设计一个模板类,使其对于Base类型的指针和所有其他指针类型的行为不同。我尝试使用enable if。但它不按我想要的方式工作。任何人都可以告诉我该怎么做。 我试过的代码:

class Base
{
};

class Derived:public Base
{
};

class Non_base
{
};

template<class T,class Enable=void> class Vector
{
public:
    Vector()
    {
        cout<<"Constructor of Vector "<<endl;
    }
};



template<class T> class Vector<T*>
{
public:
    Vector()
    {
        cout<<"Constructor of Vector<T *> "<<endl;
    }
};



template<> class Vector<Base*>
{
public:
    Vector()
    {
        cout<<"Constructor of Vector<Base*> fully specialized"<<endl;
    }
};


//template<class T> class Vector<T *>:public Vector<Base *>
//{
//public:
//    Vector()
//    {
//        cout<<"Constructor of Vector<Base*> partially specilized"<<endl;
//    }
//};


template<class T> class Vector<T*,typename enable_if<is_base_of<Base,T>::value>::type>
{
    Vector()
    {
        cout<<"Constructor of Vector<Base*> partially specilized"<<endl;
    }
};

1 个答案:

答案 0 :(得分:3)

enable_if添加到现有重载集的子集时,通常还需要将其添加到其余成员中。当启用某些重载时,必须禁用其他重载,否则会出现歧义。

template<class T> class Vector<T*,typename enable_if<!is_base_of<Base,T>::value>::type>
{
public:
    Vector()
    {
        cout<<"Constructor of Vector<T *> "<<endl;
    }
};

您不需要将enable_if<!…>添加到完整专业化中,因为它已经是该集合的最佳匹配,因此不会有歧义。