[英]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.