[英]Multiple inheritance from a pack expansion
我最近在生产代码中看到了这个,但不太明白它的作用:
template <class... Ts>
struct pool : pool_type<Ts>... {
//...
};
我从未见过父类发生包扩展。 它只是继承传递给可变参数的每种类型吗?
父母长这样:
template <class T>
struct pool_type : pool_type_impl<T> {
// ...
};
它只是继承传递给可变参数的每种类型吗?
是的。 它公开继承了每个通过的 arguments。下面给出了一个简化版本。
从参数包的文档:
根据扩展发生的位置,生成的逗号分隔列表是一种不同类型的列表:function 参数列表、成员初始值设定项列表、属性列表等。以下是所有允许上下文的列表:
- 基本说明符和成员初始值设定项列表:
包扩展可以在 class 声明中指定基类列表。
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;
}
上面程序的 output 可以在这里看到:
copy constrcutor person called
copy constructor Name called
constructor called
在上面的代码中, X
class 模板使用pack 扩展来获取每个提供的 mixins 并将其扩展到公共基础 class中。 换句话说,我们获得了X
公开继承的基类列表。 此外,我们还有一个X
构造函数,它从提供的构造函数 arguments 中复制初始化每个混入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.