Множественное наследование от расширения пакета

Недавно я видел это в производственном коде и не мог понять, что он делает:

      template <class... Ts>
struct pool : pool_type<Ts>... {
//...
};

Я никогда не видел, чтобы расширение пакета происходило для родительских классов. Он просто наследует каждый тип, переданный в varargs?

Родители выглядят так:

      template <class T>
struct pool_type : pool_type_impl<T> {
// ...
};

1 ответ

Он просто наследует каждый тип, переданный в varargs?

Да. Он публично наследуется от каждого из переданных аргументов. Ниже приведен упрощенный вариант.

Из документации пакета параметров :

В зависимости от того, где происходит расширение, результирующий список, разделенный запятыми, представляет собой список разного типа: список параметров функции, список инициализаторов членов, список атрибутов и т. д. Ниже приведен список всех разрешенных контекстов:

  • Базовые спецификаторы и списки инициализаторов членов :
    расширение пакета может указывать список базовых классов в объявлении класса.

Пример

      struct Person 
{
    Person() = default;
    Person(const Person&)
    {
        std::cout<<"copy constrcutor person called"<<std::endl;
    }
};
struct Name 
{
    Name() = default;
    Name(const Name&)
    {
        std::cout<<"copy constructor Name called"<<std::endl;
    }
};

template<class... Mixins>
//---------------vvvvvvvvv---------->used as list of base classes from which X inherits publicly
class X : public Mixins...
{
public:
//-------------------------------vvvvvvvvvvvvvvvvv---->used as member initializer list
    X(const Mixins&... mixins) : Mixins(mixins)... {}
};
int main()
{
    Person p;
    Name n;
    X<Person, Name> x(p, n); //or even just X x(p, n);  works with C++17 due to CTAD
    return 0;
}

Вывод вышеуказанной программы можно увидеть здесь:

      copy constrcutor person called
copy constructor Name called
constructor called

Объяснение

В приведенном выше коде шаблон класса использует расширение пакета, чтобы взять каждый из предоставленных миксинов и расширить его до общедоступного базового класса . Другими словами, мы получаем список базовых классов, от которых наследуется публично. Кроме того, у нас также есть Xконструктор, который копирует-инициализирует каждый из миксинов из предоставленных аргументов конструктора.

Другие вопросы по тегам