c++ - 模板特化继承自特定子类

标签 c++ templates

class Base { ... };
class Derived1 : Base { ... };
class Derived2 : Base { ... };

template <> class BaseDecorator<Base> : **SpecificDerived** { ... };

SpecificDerived是否可以引用正在使用的特定派生类?这样

BaseDecorator<Derived1> bd-d1;

会实例化一个继承自 Derived1 的 BaseDecorator 吗?

问题的出现是因为我需要为库类及其所有派生提供一个装饰器,但又想让代码尽可能保持干燥。

谢谢!

最佳答案

如果我正确理解你的问题,你希望你的 BaseDecorator 从特定的 Derived 类继承。

如果是这种情况,您可以这样做:

#include <iostream>
#include <type_traits>

class Base {
    public:
    virtual void f1() {
        std::cout << "Base::f1" << std::endl;   
    }
};

class Derived1 : public Base {
    public:
    void f1() override {
        std::cout << "Derived1::f1" << std::endl;   
    }
};

class Derived2 : public Base {
    public:
    void f1() override {
        std::cout << "Derived2::f1" << std::endl;   
    }
};

class Derived3 {
    public:
    void f1() {
        std::cout << "Derived3::f1" << std::endl;   
    }
};

template <typename T,
          typename = typename std::enable_if<std::is_base_of<Base, T>::value>::type >
class BaseDecorator;

template <typename T>
class BaseDecorator<T>: public T {
    public:
    void f2() {
        T::f1();
    }
};

int main() {
    BaseDecorator<Derived1> bd1;
    bd1.f2();

    BaseDecorator<Derived2> bd2;
    bd2.f2();

    //BaseDecorator<Derived3> bd3; // Compilation fails !!!
    //bd3.f2(); // Compilation fails !!!

    return 0;   
}

输出:

Derived1::f1
Derived1::f2

关于c++ - 模板特化继承自特定子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54101660/

相关文章:

c++ - 未在范围内声明的类对象

c++ - 避免模​​板化类型的过度重复

C++ 泛型链表独立类

c++ - 在可变参数模板方法和普通模板方法之间进行选择的规则是什么?

c++ - std::byte 可以替换 std::aligned_storage 吗?

c++ - 如何删除目录限定符以使用 Win32 API 简化路径名?

c++ - 从基类中选择子类......可能吗?

c++ - 如何理解引用列表初始化中的纯右值

c++ - 解决模板不明确的问题

c++ - 在C++中使用模板成员函数继承模板类