5

可変個引数テンプレートを試していますが、次のようなクラステンプレートを一般化(?)するために使用できるかどうかを知りたいです。

template<typename T1, typename T2 , typename T4, typename T4>
struct Foo
{
    T1      &m_member1;
    T2      &m_member2;
    T3      &m_member3;
    T4      &m_member4;
};

また、コンストラクターをチェーンすることで、すべてのメンバーを初期化できるようにしたいと思います。これは私がどこまで得たかです:

template<typename... Types>
struct Foo;

template<typename T , typename... Types>
struct Foo<T, Types ...> : public Foo<Types ...>
{
    Foo( T member , Types ... others ) : m_member( member ) , Foo<Types ...>( others )
    {
    }

    T   m_member;
};

template<typename T>
struct Foo<T>
{
    Foo( T member ) : m_member( member )
    {
    }

    T   m_member;
};

目標が次のようなオブジェクトを作成することである場合:

Foo<char,int,bool,float> f( 'a' , 42 , true , 1.234 );

コードはコンパイルに失敗し(gcc 4.5.3)、次のエラーが発生します。

TestVariadicTemplates.cpp: In constructor ‘Foo<T, Types ...>::Foo(T, Types ...)’:
TestVariadicTemplates.cpp:15:83: error: parameter packs not expanded with ‘...’:
TestVariadicTemplates.cpp:15:83: note:         ‘others’
TestVariadicTemplates.cpp:15: confused by earlier errors, bailing out

編集

のさまざまなメンバーを参照するための最良の方法は何でしょうFooか?

4

1 に答える 1

4

あなたはそれが言うことをしなければなりません:パラメータパック(可変個引数パラメータ)から来る変数を。で展開し...ます。

つまり、代わりに

Foo<Types ...>( others )

書きます

Foo<Types ...>( others... )
于 2012-10-15T21:04:28.443 に答える