首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解压缩可变模板参数以定义新的模板参数

解压缩可变模板参数以定义新的模板参数
EN

Stack Overflow用户
提问于 2018-09-28 23:18:07
回答 3查看 365关注 0票数 8

我是新的模板编程,我有两个questions...Hopefully,有人可以帮助我。我试图使用可变模板来生成另一个变量模板的新输入。换句话说,我有一堂课

代码语言:javascript
运行
复制
template <std::size_t N, std::size_t... M>
class Class1 {

}

我希望使用N,M表示的整数值来生成一组新的std::bitset类型的输入到另一个模板类

代码语言:javascript
运行
复制
template <typename T, typename... Ts>
class Class2 {

}

因此,例如,如果我使用Class1<10,20,25>,我希望在Class1的主体中创建一个Class2<std::bitset<10>, std::bitset<20>, std::bitset<25>>变量。是否有一种简单的方法可以使用C++11来完成这个任务?

那么,我的第二个问题是,如何更多地将其抽象,以便使解包不特定于std::bitset类?是否有一种方法可以修改Class1模板定义,以便我可以扩展一些我开发的任意模板类而不是std::bitset

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-28 23:25:48

你可以写这样的东西:

代码语言:javascript
运行
复制
template <std::size_t N, std::size_t... M>
class Class1 {
    template <template <typename, typename...> class C,
              template <std::size_t> class inner>
    using rebind_with_type = C<inner<N>, inner<M>...>;
};

然后

代码语言:javascript
运行
复制
Class1<10, 20, 25>::rebind_with_type<Class2, std::bit_set>
// -> Class2<std::bit_set<10>, std::bit_set<20>, std::bit_set<25>>

如果用依赖的名字称呼它,不要忘记typename/template

代码语言:javascript
运行
复制
typename Class1<N, M...>::template rebind_with_type<Class2, std::bit_set>
// -> Class2<std::bit_set<N>, std::bit_set<M>...>
票数 9
EN

Stack Overflow用户

发布于 2018-09-28 23:42:27

我发现你能想到。参数包上的运算符是这样的:

代码语言:javascript
运行
复制
f(g(Xs)...);

将扩展到

代码语言:javascript
运行
复制
f(g(Xs1), g(Xs2), ..., g(Xsn));

对于任何操作f和g。实际上,它所做的就是添加一个独立的g的逗号列表,该列表应用于所提供的每个参数。那个..。定义应该从何处开始展开这些操作可以用于类型或值,因此在您的示例中,我们的f是Class2<...>,我们的g是std::bitset,我们的类型如下所示

代码语言:javascript
运行
复制
Class2<std::bitset<N>, std::bitset<M>...>

第一个需要显式添加,因为它当然不是参数包的一部分。

票数 4
EN

Stack Overflow用户

发布于 2018-09-29 11:01:56

其他答案很好,但让我给你一个更通用的版本,接受的答案。您基本上创建了一个使用别名,它接受两个模板,第一个是将类模板作为模板参数的类,第二个是要传递类型的模板(如bitset)。

代码语言:javascript
运行
复制
template<template<class...> class Y, template<class...> class Z, class... Ts>
using fold_types_into_t = Y<Z<Ts>...>;
template<template<class...> class Y, template<auto...> class Z, auto... Vs>
using fold_values_into_t = Y<Z<Vs>...>;

template<class,class...>
struct Class2;

template <std::size_t N, std::size_t... M>
class Class1 {
  // Class2<std::bitset<10>, std::bitset<20>, std::bitset<25>>
  using T=fold_values_into_t<Class2, std::bitset, N, M...>;
};

还可以添加对接受值和类型的类的支持。

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

https://stackoverflow.com/questions/52563691

复制
相关文章

相似问题

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