template<int... Is>
struct seq { };
template<int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };
template<int... Is>
struct gen_seq<0, Is...> : seq<Is...> { };
调用gen_seq<3>得到最终结构体seq<0, 1, 2>{}类型时,我无法理解"struct seq<0, 1, 2>{}"数据类型的含义? 这意味着一个结构包含三个数字?
它是可变参数模板的使用,它可以接受任意数量的参数。可以在这些结构的构造函数中使用__PRETTY_FUNCTION__
检查调用堆栈。
#include <iostream>
template<int... Is>
struct seq {
seq(){std::cout<<__PRETTY_FUNCTION__<<std::endl;}
};
template<int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> {
gen_seq(){std::cout<<__PRETTY_FUNCTION__<<std::endl;}
};
template<int... Is>
struct gen_seq<0, Is...> : seq<Is...> {
gen_seq(){std::cout<<__PRETTY_FUNCTION__<<std::endl;}
};
int main() {
gen_seq<3> t;
}
输出:
seq<0, 1, 2>::seq() [Is = <0, 1, 2>]
gen_seq<0, 0, 1, 2>::gen_seq() [N = 0, Is = <0, 1, 2>]
gen_seq<1, 1, 2>::gen_seq() [N = 1, Is = <1, 2>]
gen_seq<2, 2>::gen_seq() [N = 2, Is = <2>]
gen_seq<3>::gen_seq() [N = 3, Is = <>]
它是包含三个数字类型的对象。对象没有数据成员。
它用于将模板参数包(int
s(作为单个值携带,例如
template <typename UnaryOperation, typename... Ts, int... Is>
std::tuple<Ts...> tuple_for_impl(UnaryOperation op, std::tuple<Ts...> input, seq<Is...> /*unused*/) {
return { op(std::get<Is>(input))... };
}
template <typename UnaryOperation, typename... Ts>
std::tuple<Ts...> tuple_for(UnaryOperation op, std::tuple<Ts...> input) {
return tuple_for_impl(op, input, gen_seq<sizeof...(Ts)>{});
}
在 C++14 中,它包含在标准库中,如std::integer_sequence