Специализация шаблона наследуется от определенного подкласса - PullRequest
0 голосов
/ 09 января 2019
class Base { ... };
class Derived1 : Base { ... };
class Derived2 : Base { ... };

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

Возможно ли для SpecificDerived ссылаться на определенный используемый производный класс? Такой, что

BaseDecorator<Derived1> bd-d1;

Будет ли создан экземпляр BaseDecorator, который наследуется от Derived1?

Проблема возникла, потому что мне нужно предоставить декоратор для библиотечного класса и всех его производных, но я хочу сохранить код как можно более сухим.

Спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Если я правильно понял ваш вопрос, вы хотите, чтобы ваш BaseDecorator наследовал от определенного производного класса.

Если это так, Вы можете сделать что-то вроде этого:

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...