首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作模板循环?

问如何制作模板循环?
EN

Stack Overflow用户
提问于 2022-07-25 05:47:55
回答 1查看 139关注 0票数 2

我经常摆弄循环,它们几乎是一样的,我认为如果您有一个模板,您可以简化很多代码。

代码语言:javascript
复制
// the blocks can be different, but the number is known before compilation
const int block_1 = 10,
          block_2 = 4,
          block_3 = 6,
          block_4 = 3;

基本上所有的周期都是这样的

周期可以是这样的

代码语言:javascript
复制
for (int i = 1; i < block_1 - 1; ++i) {

}

或者这个

代码语言:javascript
复制
for (int i = 1; i < block_1 - 1; ++i) {
    for (int k = 1; k < block_2 - 1; ++k) {

    }
}

或者这个

代码语言:javascript
复制
for (int i = 1; i < block_1 - 1; ++i) {
    for (int k = 1; k < block_2 - 1; ++k) {
        for (int j = 1; j < block_3 - 1; ++j) {
          

        }
    }
}

一个周期内的周期数可能很多,但它们是相似的。

我认为,如果我一直使用模板而不是循环,它会更方便还是不方便,但也许我不应该,你会劝阻我不要这么做。

理想情况下,我想要这样的模板

代码语言:javascript
复制
for_funk(block_1, block_2, block_3) {
   // Here I write the code that will be inside the three loops block_1, block_2, block_3
}

也许这会对https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2374r4.html有帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 06:19:17

是的,您可以组合iota_view和cartesian_product_view来获得C++23中的嵌套索引。

代码语言:javascript
复制
constexpr inline auto for_funk = [](auto... index) {
  return std::views::cartesian_product(std::views::iota(1, index-1)...);
};

const int block_1 = 10,
          block_2 = 4,
          block_3 = 6,
          block_4 = 3;
for (auto [i, j, k, w] : for_funk(block_1, block_2, block_3, block_4))
  // use i, j, k, w

用range-v3演示

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73104516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档