Variadic可变参数模板模板参数

Tas*_*kie 7 c++ variadic-functions template-templates variadic-templates c++11

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

template<template<typename,size_t...> class Pack, 
  typename T, size_t ... Args>
void foo(const Pack<T,Args...>& a);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

现在如果我们想要传递Pack具有不同可变参数的可变数量的对象,例如Args0...,Args1...,Args2....

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

template<template<typename,size_t...> ... class Pack, typename T,...>  
void foo(const Pack<T,...> ... packs);
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 6

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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...>;
};
Run Code Online (Sandbox Code Playgroud)

然后在foo你内部可以提取参数并随意使用它们.例如,要从包中获取std::tuple包含所有Ts的内容:

using all_ts = std::tuple<typename extract_args<Ts>::type...>;
Run Code Online (Sandbox Code Playgroud)