如何制作循环模板?

use*_*ser 2 c++ templates c++20 c++23

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

// 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;
Run Code Online (Sandbox Code Playgroud)

基本上所有的循环都是这样

循环可以是这样的

for (int i = 1; i < block_1 - 1; ++i) {

}
Run Code Online (Sandbox Code Playgroud)

或这个

for (int i = 1; i < block_1 - 1; ++i) {
    for (int k = 1; k < block_2 - 1; ++k) {

    }
}
Run Code Online (Sandbox Code Playgroud)

或这个

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) {
          

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

一个循环内的循环数量可以很多,但它们是相似的。

我认为如果我一直使用模板而不是循环,是否会更方便,但也许我不应该这样做,你会阻止我这样做。

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

康桓瑋*_*康桓瑋 8

是的,您可以在 C++23 中组合iota_viewcartesian_product_view获取嵌套索引

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
Run Code Online (Sandbox Code Playgroud)

使用 range-v3 进行演示