2

テンプレート クラスのインスタンスを作成して格納する「オブジェクト マネージャ」を作成しようとしています。このクラスは 1 つのテンプレート引数を取り、基本クラスから継承して、異なるテンプレート引数を持つインスタンスを同じコンテナーに格納できるようにします。テンプレート引数として使用される型は、可変個引数テンプレート関数でユーザーによって提供されます。

以下は、この問題を説明する最小限の例です。

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使用するすべてにデフォルトのコンストラクターがあると仮定しましょう。フォールド式を使用して for each type in を作成し、結果のポインターを vector in に追加する方法はB<T>ありnewますTypesgenerate_a_vec()?

4

1 に答える 1

5

あなたが何を望んでいるのか私が正しく理解しているなら、あなたは探している

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

しかし、これは「折りたたみ式」ではありません。これは単純な可変個引数テンプレート パックの拡張であり、C++11 以降で利用できます。

「フォールド式」(C++17 から利用可能) の例は、次のようになります。

std::vector<A*> a_vec;

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

可変個引数テンプレート パックは、カンマ演算子を使用して折りたたみ展開されます。

于 2020-10-07T00:43:30.943 に答える