首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变模板模板?

可变模板模板?
EN

Stack Overflow用户
提问于 2016-10-23 08:29:59
回答 2查看 639关注 0票数 9

假设您有一个元组类型,您希望提取它的模板参数包,以便实例化另一个模板。如果这是一个类型模板,那么我可以拥有这样的实用程序:

代码语言:javascript
复制
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++17的正确语法。

代码语言:javascript
复制
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...>;
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-23 09:20:33

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

§14.3.3 tem.arg.Template/1 模板模板参数的模板参数应该是类模板或别名模板的名称,表示为id表达式。

变量模板不符合这一要求。

您可以稍微欺骗一下并使用代理类型来选择模板:

代码语言:javascript
复制
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...>;
};

然后为了

代码语言:javascript
复制
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...>;
};

你可以说

代码语言:javascript
复制
PutTupleInTV<tup, use_foo>::value

live demo

票数 6
EN

Stack Overflow用户

发布于 2016-10-23 08:47:25

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40201020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档