繁体   English   中英

Variadic可变参数模板模板参数

[英]Variadic variadic template template parameters

是否有一种直接的方法来获得可变参数的可变参数模板模板参数。 例如,考虑以下函数签名

template<template<typename,size_t...> class Pack, 
  typename T, size_t ... Args>
void foo(const Pack<T,Args...>& a);

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

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...

所以我在想是否有一种切实可行的做法(以下是草图表示)。

template<template<typename,size_t...> ... class Pack, typename T,...>  
void foo(const Pack<T,...> ... packs);

我只想使用普通的可变参数模板:

template<typename... Ts>  
void foo(const Ts&... packs) {

}

然后写一个特征来提取type和size_t 您可以轻松添加一些帮助程序别名模板来执行您喜欢的任何操作。

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

using all_ts = std::tuple<typename extract_args<Ts>::type...>;

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

#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模板参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM