簡體   English   中英

包擴展中的多個 inheritance

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM