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

可变模板模板参数
EN

Stack Overflow用户
提问于 2016-07-27 19:34:43
回答 2查看 1.8K关注 0票数 9

有没有一种简单的方法来获得可变的模板参数。例如,考虑以下函数签名

代码语言:javascript
复制
template<template<typename,size_t...> class Pack, 
  typename T, size_t ... Args>
void foo(const Pack<T,Args...>& a);

如果我们想要传递两个Pack,我们现在必须做一个重载

代码语言:javascript
复制
template<template<typename,size_t...> class Pack, 
  typename T, size_t ... Args0, size_t ... Args1>
void foo(const Pack<T,Args0...>& a, const Pack<T,Args1...>& b);

现在,如果我们想用不同的可变参数传递数量可变的Pack对象,比如Args0...,Args1...,Args2...,该怎么办呢?

所以我在想,是否有一种切实可行的方法来做一些事情,比如(下面肯定是一个草图表示)。

代码语言:javascript
复制
template<template<typename,size_t...> ... class Pack, typename T,...>  
void foo(const Pack<T,...> ... packs);
EN

回答 2

Stack Overflow用户

发布于 2016-07-27 19:48:38

我只会使用一个普通的可变模板:

代码语言:javascript
复制
template<typename... Ts>  
void foo(const Ts&... packs) {

}

然后编写一个特征来提取类型和size_t,你可以很容易地添加一些助手别名模板来做任何你想做的事情。

代码语言:javascript
复制
template <typename T> struct extract_args;

template <template <typename, size_t...> class Pack, typename T, size_t... Args> 
struct extract_args<Pack<T,Args...>> {
    using type = T;
    using args = std::index_sequence<Args...>;
};

然后在foo中,您可以提取参数并随心所欲地使用它们。例如,要从包中获取包含所有Tstd::tuple

代码语言:javascript
复制
using all_ts = std::tuple<typename extract_args<Ts>::type...>;
票数 6
EN

Stack Overflow用户

发布于 2016-07-27 19:53:52

我建议您以这种方式递归地管理Pack参数

代码语言:javascript
复制
#include <array>

template <typename T, std::size_t ... Args>
struct  testS
 { };

void foo ()
 { /* terminal iteration */ }

template <template <typename, std::size_t...> class Pack,
          typename T, std::size_t ... Args, typename ... Packs>  
void foo (const Pack<T, Args...> pack0, Packs ... packs)
 { 
   // do something with pack0

   foo(packs...);
 }

int main()
 {
   foo(testS<int>{}, std::array<long, 5U>{}, testS<char, 7U, 9U, 11U>{});

   return 0;
 }

--编辑-

修改了示例,以显示不同类型和可变数量的std::size_t模板参数的用法。

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

https://stackoverflow.com/questions/38611823

复制
相关文章

相似问题

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