You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成指定数量与步长的编译期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, 9
  • stepped_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:42:38