如何生成指定数量与步长的编译期std::index_sequence?
自定义带步长的std::index_sequence实现
要生成指定步长的倍数序列(比如0,3,6,9...或0,2,4...),可以基于标准库的std::index_sequence和std::make_index_sequence做编译时扩展,核心思路是将基础序列的每个索引值乘以步长,得到目标序列。
核心实现代码
首先写一个编译时的辅助函数模板,用来将基础索引序列的每个元素乘以步长:
#include <utility> #include <iostream> // 辅助函数:将index_sequence的每个元素乘以指定步长 template<std::size_t Step, std::size_t... Indices> constexpr auto multiply_indices(std::index_sequence<Indices...>) { return std::index_sequence<Indices * Step...>{}; } // 封装为模板别名,直接指定序列长度和步长 template<std::size_t SequenceLength, std::size_t Step> using stepped_index_sequence = decltype( multiply_indices<Step>(std::make_index_sequence<SequenceLength>()) );
使用示例
通过stepped_index_sequence<长度, 步长>即可直接生成目标序列:
stepped_index_sequence<4, 3>对应序列:0, 3, 6, 9stepped_index_sequence<6, 2>对应序列:0, 2, 4, 6, 8, 10
可以写一个测试函数验证效果:
// 打印序列的辅助函数 template<std::size_t... Is> void print_sequence(std::index_sequence<Is...>) { ((std::cout << Is << " "), ...); std::cout << "\n"; } int main() { // 打印步长3、长度4的序列 print_sequence(stepped_index_sequence<4, 3>{}); // 打印步长2、长度6的序列 print_sequence(stepped_index_sequence<6, 2>{}); return 0; }
编译运行后会输出:
0 3 6 9 0 2 4 6 8 10
注意事项
- 如果步长
Step设为0,生成的序列会全是0,需根据实际需求避免这种场景。 - 整个实现完全是编译时计算,不会带来运行时开销,符合
std::index_sequence的设计初衷。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

