Генерация сложного наследования вариативного шаблона

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

Предположим, у меня есть класс, который может принимать несколько других классов в качестве параметров шаблона, каждый из которых имеет вложенный класс (назовем его nested_class):

template<typename... Classes> class MyClass {
    class InnerClass { ... };
};

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

Например:

class A1 {
public:
    struct nested_class {
        do_stuff() { ... }
    };
};
class A2 {
public:
    struct nested_class {
        do_other_stuff() { ... }
    };
};

using C = MyClass<A1, A2>;

идея заключалась бы в том, что C имеет вложенный класс InnerClass, который наследует A1::nested_class и A2::nested_class.

Есть ли что-нибудь, что могло бы достичь такого? Я лично не могу найти способ, но, возможно, это возможно. Будут ли строители иерархии наследования, такие как генераторы иерархии Александреску (которые можно найти в Loki: http://loki-lib.sourceforge.net/html/a00653.html) поможет?

заранее спасибо, если у кого есть идеи.


person Julien Lopez    schedule 20.09.2013    source источник


Ответы (1)


Чтобы сделать InnerClass производным от всех nested_classes, вы должны использовать шаблон Classes::nested_class...:

#include <iostream>
#include <type_traits>

template <class... Classes>
class Myclass
{
public:
    class InnerClass: public Classes::nested_class...
    {

    };
};

class A1 {
public:
    struct nested_class {
        void do_stuff() { /*...*/ }
    };
};
class A2 {
public:
    struct nested_class {
        void do_other_stuff() { /*...*/ }
    };
};

int main()
{
    using Class = Myclass<A1, A2>;

    std::cout << std::is_base_of<A1::nested_class, Class::InnerClass>::value << std::endl;
    std::cout << std::is_base_of<A2::nested_class, Class::InnerClass>::value << std::endl;

    return 0;
}
person awesoon    schedule 20.09.2013