包扩展的多重继承



我最近在生产代码中看到了这一点,但不太清楚它的作用:

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

我从未见过父类的包扩展。它只是继承传递到varargs的每个类型吗?

父母长这样:

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

它只是继承传递到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类模板使用包扩展来获取每个提供的mixin,并将其扩展为公共基类。换句话说,我们得到了X公开继承的基类列表。此外,我们还有一个X构造函数,该构造函数从提供的构造函数参数中复制初始化每个mixin。

最新更新