c++ - 类层次结构的模板类?

标签 c++ templates

有没有一种方法可以定义一个模板类,该模板类只能与来自特定类层次结构的派生类一起使用?

假设我有 Animal 基类

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 >”,我应该会遇到编译错误(或一些错误),即使 Duck 中定义了方法 shout() 。 (这个问题主要是让我了解是否可以将 OO 范式与泛型编程混合使用)

最佳答案

我会立即想到两种形式:

SFINAE

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/

相关文章:

c++ - cpp 文件的函数模板特化语法

c++ - 边界框方向

c++ - OpenMP omp_get_wtime g++ 32 位

c++ - 使用 for_each() 和 lambda 函数打印 C 风格数组的模板函数

c++ - 为什么这个重载/命名空间/模板相关的 C++ 代码不能编译?

templates - 通过 HStringTemplate 生成带有一些逻辑的模板

c++ - 为什么声明 `void(*pf)(int) = bar;` 会触发下面代码片段中的 `static_assert`?

c++ - 在 C++11 中,是否可以从具有指定模板参数的模板类中获取通用模板类?

c++ - 模板类实例化中的指针转换无效

c++ - 每当在 C++ 中调用函数时生成新类型