integer_sequence自实现版本
#include <iostream>
// the type holding sequences
template <int... Ns>
struct sequence {};
// First define the template signature
template <int... Ns>
struct seq_gen;
// forward extend recursively
template <int I, int... Ns>
struct seq_gen<I, Ns...> {
// Take front most number of sequence,
// decrement it, and prepend it twice.
// First I - 1 goes into the counter,
// Second I - 1 goes into the sequence.
using type = typename seq_gen<I - 1, I - 1, Ns...>::type;
};
// Recursion abort
template <int... Ns>
struct seq_gen<0, Ns...> {
using type = sequence<Ns...>;
};
template <int N>
using sequence_t = typename seq_gen<N>::type;
template <int... Is>
void show(sequence<Is...>) {
(((std::cout << " ") << Is), ...);
}
int main() {
show(sequence_t<10>());
}
integer_sequence.cpp
g++ integer_sequence.cpp -o integer_sequence --std=c++17
analyze
sequence_t<10>是seq_gen<10>::type 这个类型的别名.
seq_gen<10>唯一能匹配的模板特化为:seq_gen<10, int…Ns> 。现在这个Ns是空列表{}。
这是1个模板参数变成2组模板参数质的飞跃。
我们用伪代码seq_gen<10, {}>表示seq_gen<10, {}>::type 等价于seq_gen<10-1,10-1, {}>::type即seq_gen<9,9, {}>::type
seq_gen<9,9, {}>唯一能匹配的模板特化为:seq_gen<9, int…Ns>。现在这个Ns是列表{9}。
我们用伪代码seq_gen<9, {9}>表示.
seq_gen<9, {9}>::type 等价于seq_gen<9-1,9-1, {9}>::type即seq_gen<8,8, {9}>::type
seq_gen<8,8, {9}>唯一能匹配的模板特化为:seq_gen<8, int…Ns>。现在这个Ns是列表{8,9}。
我们用伪代码seq_gen<8, {8,9}>表示.
…
seq_gen<0, {0,1,2,3,4,5,6,7,8,9}>唯一能匹配的模板特化为第22行,递归终结特化。
seq_ge