是否有一种直接的方法来获得可变参数的可变参数模板模板参数。例如,考虑以下函数签名
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);
答案 0 :(得分:6)
我只想使用普通的可变参数模板:
template<typename... Ts>
void foo(const Ts&... packs) {
}
然后写一个特征来提取类型和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
内你可以提取参数并随意使用它们。例如,要从包中获取包含所有std::tuple
的{{1}}:
T
答案 1 :(得分:3)
我建议你以这种方式递归地管理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
模板参数。