9

タプル型があり、別のテンプレートをインスタンス化するためにそのテンプレート パラメーター パックを抽出したいとします。それがタイプ テンプレートの場合、次のようなユーティリティを使用できます。

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 (auto 型の非型テンプレート パラメーターをサポートする唯一のコンパイラ) に対して次のことを試しましたが、失敗しました。実際、これが C++17 の正しい構文かどうかはわかりません。

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...>;
};
4

2 に答える 2

6

私はあなたがそれを行うことができるとは思わない. N4606 の引用:

§14.3.3 [temp.arg.template]/1

テンプレートtemplate-parametertemplate-argumentは、クラス テンプレートまたはエイリアス テンプレートの名前であり、 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

ライブデモ

于 2016-10-23T09:20:33.717 に答える
0

PutTupleInTV は PutTupleInV と同じ名前ではありません。テンプレート PutTupleInV を特殊化するのではなく、特殊化構文を使用して、PutTupleInTV と呼ばれる新しいものを作成します。

于 2016-10-23T08:47:25.493 に答える