2016-10-23 6 views
8

タプルタイプがあり、別のテンプレートをインスタンス化するためにそのテンプレートパラメータパックを抽出するとします。それがタイプテンプレートの場合、私はこのようなユーティリティを持つことができます:可変テンプレートテンプレート?

template < typename Tuple, template <typename...> typename What > 
struct PutTupleInT; 

template < typename... Types, template <typename...> typename What > 
struct PutTupleInT<std::tuple<Types...>, What> 
{ 
    using Result = What<Types...>; 
}; 

しかし、目的のテンプレートが変数テンプレートの場合はどうなりますか? template <typename...> typename Whatはタイプテンプレートの「プレースホルダー」ですが、変数テンプレートの「プレースホルダー」は何ですか?

私はclang-4.0.0(自動タイプの非型テンプレートパラメータをサポートする唯一のコンパイラ)で以下を試しましたが、失敗しました。実際には、これがC++の正しい構文であるかどうかはわかりません。

template < typename Tuple, template <typename...> auto What > 
struct PutTupleInV; 

template < typename... Types, template <typename...> auto What > 
struct PutTupleInV<std::tuple<Types...>, What> 
{ 
    static constexpr auto value = What<Types...>; 
}; 
+0

'decltype(vartempl)'を使用して変数テンプレートのタイプを抽出することはできません。それはあなたが実際に興味を持っているものですか? – skypjack

+0

@skypjack申し訳ありませんが、私はあなたがどういう意味を理解していません。 – Vahagn

答えて

6

私はあなたがそれを行うことはできないと思います。 N4606を引用:テンプレートテンプレートパラメータの

§14.3.3[temp.arg.template]/1

テンプレート引数クラステンプレートの 名であるかなければなりませんエイリアステンプレート id-expressionで表されます。

可変テンプレートがこの要件に適合しません。


あなたは少しカンニングしてテンプレートを選択するために、プロキシタイプを使用することができます。

template < typename Tuple, class Proxy> 
struct PutTupleInTV; 

template < typename... Types, class Proxy> 
struct PutTupleInTV<std::tuple<Types...>, Proxy> 
{ 
    static constexpr auto value = Proxy::template value<Types...>; 
}; 

、その後

template<typename...> struct foo{}; 
template<typename... Ts> constexpr foo<Ts...> foo_v{}; 
struct use_foo 
{ 
    template<typename... Ts> 
    static constexpr auto value = foo_v<Ts...>; 
}; 

のためにあなたは

PutTupleInTV<tup, use_foo>::value 

live demoを言うことができます

+0

チートは実際にはあまり役に立ちません。変数には「値」という名前をつけ、構造体に配置する必要があるからです。 – Vahagn

+0

@Vahagnはい、プロキシ構造体を自分で作る必要があります。私はこれの周りに道を見ない(何もないという意味ではない、私はちょうど何も知らない) – krzaq

0

PutTupleInTVはPutTupleInVと同じ名前ではありません。テンプレートPutTupleInVを専門にするのではなく、PutTupleInTVという名前の新しい構文を作成するための特殊構文を使用しています。

+0

これはタイプミスです。指摘してくれてありがとう。 – Vahagn

関連する問題