有没有一种方法可以定义只能用于特定类层次结构的派生类的模板类?

说我有动物基础班

class Animal{
    public:
        virtual ~Animal();
        virtual void shout() = 0;
    };


和Dog,Cat,Tiger是派生类

class Dog : public Animal{
    public:
    virtual void shout(){
        cout<<"Bark";
    }
}
class Cat : public Animal{
    public:
    virtual void shout()
    {
        cout<<"Meow";
    }
}


我需要定义一个模板类,例如“ AnimalTemplate”,该模板类只能与Animal的派生类一起使用,因此,如果我尝试执行“ AnimalTemplate ”,即使Duck也应该得到编译错误(或某些错误)具有定义的方法shout()。
(这个问题主要是让我了解我们是否可以将OO范例与泛型编程相结合)

最佳答案

立刻想到两种形式:

FINEA

template<typename T,
         typename = typename std::enable_if<std::is_base_of<Animal,T>::value>::type>
class AnimalTemplate
{
public:
    AnimalTemplate() {}
};


static_assert

template<typename T>
class AnimalTemplate
{
public:
    static_assert(std::is_base_of<Animal,T>::value, "T must be derived from Animal");
    AnimalTemplate() {}
};


显然,后者可以告诉您失败的原因。

关于c++ - 用于类层次结构的模板类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19646676/

10-10 06:44