簡體   English   中英

如何使用折疊表達式實例化可變參數模板函數中的每個類型?

[英]How to use fold expression to instantiate each type in a variadic template function?

我正在嘗試創建一個“對象管理器”,它將創建和存儲模板類的實例。 該類采用一個模板參數並從基類繼承,以允許將具有不同模板參數的實例存儲在同一容器中。 將用作模板參數的類型將由用戶在可變參數模板函數中提供。

以下是說明問題的最小示例:

struct A
{
    int m_a = 0;
};

template<typename T>
struct B : public A
{
    int m_b = 1;
    T m_t;
};

template<typename... Types> std::vector<A*> generate_a_vec()
{
    std::vector<A*> a_vec; // <--- Need to initialize with a new B<T> for each T in "Types"
    return a_vec;
}

int main()
{
    std::vector<A*> a_vec = generate_a_vec<int, float, bool>();

    for(A* a : a_vec)
    {
       std::cout << a->m_a << std::endl;
    }

    return 0;
}

假設我們將使用的每個T都有一個默認構造函數。 有沒有辦法使用折疊表達式為Types每種類型創建一個帶有newB<T>並將結果指針添加到generate_a_vec()的向量?

如果我正確理解你想要什么,你正在尋找

std::vector<A*> a_vec { new B<Types>{}... };

但這不是“折疊表達”; 它是一個簡單的可變參數模板包擴展,從 C++11 開始可用。

“折疊表達式”(可從 C++17 獲得)的示例如下

std::vector<A*> a_vec;

( a_vec.push_back( new B<Types>{} ), ... );

其中可變參數模板包使用逗號運算符折疊擴展

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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