1. ホーム
  2. c++

テンプレートパラメーターパックを展開せずに「保存」することは可能ですか?

2023-12-13 16:09:24

質問

C++0x variadic templates を使って実験しているときに、この問題にぶつかりました。

template < typename ...Args >
struct identities
{
    typedef Args type; //compile error: "parameter packs not expanded with '...'
};

//The following code just shows an example of potential use, but has no relation
//with what I am actually trying to achieve.
template < typename T >
struct convert_in_tuple
{
    typedef std::tuple< typename T::type... > type;
};

typedef convert_in_tuple< identities< int, float > >::type int_float_tuple;

GCC 4.5.0では、テンプレートパラメーターパックをtypedefしようとすると、エラーが発生します。

基本的に、私はtypedefでパラメータパックを解凍することなく、"store"したいのです。それは可能ですか? そうでない場合、これが許可されない何らかの理由がありますか?

どのように解決するのですか?

Ben氏の方法よりも少し一般的な方法ですが、次のような方法もあります。

#include <tuple>

template <typename... Args>
struct variadic_typedef
{
    // this single type represents a collection of types,
    // as the template arguments it took to define it
};

template <typename... Args>
struct convert_in_tuple
{
    // base case, nothing special,
    // just use the arguments directly
    // however they need to be used
    typedef std::tuple<Args...> type;
};

template <typename... Args>
struct convert_in_tuple<variadic_typedef<Args...>>
{
    // expand the variadic_typedef back into
    // its arguments, via specialization
    // (doesn't rely on functionality to be provided
    // by the variadic_typedef struct itself, generic)
    typedef typename convert_in_tuple<Args...>::type type;
};

typedef variadic_typedef<int, float> myTypes;
typedef convert_in_tuple<myTypes>::type int_float_tuple;

int main()
{}