Множественное наследование от расширения пакета
Недавно я видел это в производственном коде и не мог понять, что он делает:
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
конструктор, который копирует-инициализирует каждый из миксинов из предоставленных аргументов конструктора.