变量模板模板?

时间:2016-10-23 08:29:59

标签: c++ c++14 c++17 template-templates variable-templates

假设您有一个元组类型,并且您想要提取其模板参数包以便实例化另一个模板。如果那是一个类型模板,那么我可以使用这样的实用程序:

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是&#34;占位符&#34;对于一个类型模板,那么什么是&#34;占位符&#34;对于变量模板?

我已经为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...>;
};

2 个答案:

答案 0 :(得分:6)

我认为你不能那样做。引用N4606:

  

§14.3.3[temp.arg.template] / 1

     

模板模板参数 template-argument 应为   类模板或别名模板的名称,表示为    ID-表达

变量模板不符合此要求。

您可以作弊并使用代理类型来选择模板:

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

答案 1 :(得分:0)

PutTupleInTV与PutTupleInV的名称不同。您没有专门使用模板PutTupleInV,而是使用专门化语法创建一些新的东西,称为PutTupleInTV。