【发布时间】:2017-11-25 05:30:13
【问题描述】:
如何将参数包中的每个参数表示为可变参数模板本身就是一个参数包?
考虑这段代码:
template <typename... TS>
void use_tuple(std::tuple<TS...> arg0);
template <typename... TS0, typename... TS1>
void use_tuple(std::tuple<TS0...> arg0, std::tuple<TS1...> arg1);
我希望use_tuple 能够获取任意数量的元组。现在我必须这样写:
template <typename... TS0, typename... REST>
void use_tuple(std::tuple<TS0...> arg0, REST... rest);
void use_tuple(); // Terminates the recursion.
但我想这样写:
// Each ELEMENT in PACK_OF_PACKS is a parameter pack.
template <(typename...)... PACK_OF_PACKS>
void use_tuple(std::tuple<PACK_OF_PACKS...>... args);
这甚至可能吗?如果是这样,怎么做?如果没有,我还能做什么?我对这段代码的目标是获取所有元组中包含的类型。
我的最终目标是这样的:
template <typename...> void foo();
use_tuple(std::tuple<int, float, char>{},
std::tuple<double, short, std::string>{},
std::tuple<std::function<void()>, std::vector<int>>{});
// Results in a call to
// foo<int, float, char, double, short, std::string,
// std::function<void()>, std::vector<int>>();
但我想在不依赖于传递的元组的数量或每个中的元素数量的少量恒定间接中实现这一点。所以没有递归。
【问题讨论】:
-
use_tuple(std::tuple<PACK_OF_PACKS...>... args)的正文会是什么样子?它必须有一个... ...扩展,这不是语言的一部分 -
@Filipp - 你的意思是
use_tuple<std::tuple<std::tuple<pack1...>, std::tuple<pack2...>, std::tuple<pack3...>, ...还是std::tuple<pack1..., pack2..., pack3...? -
你使用的是 C++11 还是 C++14?
-
任一标准的可用性会改变答案吗?我很高兴看到任何 C++ 版本(11 或更高版本)的答案。
标签: c++ c++11 templates c++14 variadic-templates