我们可以通过一些递归模板魔法来实现这个目标:
template <int... Args>
struct FiltersFor;
template <typename Tuple1, typename Tuple2>
using tuple_cat_t = decltype(std::tuple_cat(std::declval<Tuple1>(),
std::declval<Tuple2>()));
template <int Ins, int Outs, int... Others>
struct FiltersFor<Ins,Outs,Others...>
;
template <int Dummy>
struct FiltersFor<Dummy>
;
template <>
struct FiltersFor<>
;
template<int... args>
using Chain = typename FiltersFor<args...>::type;
另外,我们可以摆脱单个 int 和无 int 版本,并像这样定义主模板:
template <int... Args>
struct FiltersFor
{
using type = std::tuple<>
}
现在我们可以这样测试:
static_assert(std::is_same<Chain<1,2,3,4>, std::tuple<Filter<1,2>,Filter<2,3>,Filter<3,4>>>::value, "wat");
static_assert(std::is_same<Chain<1,2>, std::tuple<Filter<1,2>>>::value, "wat");
static_assert(std::is_same<Chain<>, std::tuple<>>::value, "wat");
演示