数据类型"struct seq<0, 1, 2>{}"含义是什么?

What "struct seq<0, 1, 2>{}" data type meaning?

本文关键字:是什么 gt lt struct 数据类型 seq      更新时间:2023-10-16
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 = <>]

它是包含三个数字类型的对象。对象没有数据成员。

它用于将模板参数包(ints(作为单个值携带,例如

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