C++ 相当于 std::all_of 但使用范围循环?

use*_*490 1 c++ algorithm c++17 c++20

我正在尝试重写一段目前看起来像这样的代码:

if (nchildren > 7 && 
  parent->isChildValid(0) && 
  parent->isChildValid(1) && 
  parent->isChildValid(2) && 
  parent->isChildValid(3) && 
  ... 
  parent->isChildValid(7)
) {

}
Run Code Online (Sandbox Code Playgroud)

它测试parent->isChildValid(i)8 次,其中i, 是在此特定情况下 [0:7] 范围内的索引。我正在寻找(作为练习)一种使用类似于std::all_of但我了解这些函数仅适用于支持迭代器的构造的方法来提高效率(想象一下稍后的范围变化)。所以像这样:

std::all_of(0, 7, [&](int i){ return parent->isChildValid(i); });
Run Code Online (Sandbox Code Playgroud)

当然不行。但我想知道是否有类似/替代选项(我确信有))而不(当然)声明i是一个向量并使用{0, 1, 2, 3, 4, 5, 6, 7}. 我也试图避免这种情况,而是寻找类似的东西,all_of但我可以在其中设置我想要测试函数的最小和最大索引(范围循环类型)。

编辑:我无法使用升压。

康桓瑋*_*康桓瑋 9

在 C++20 中,您可以使用views::iotaranges::all_of来执行此操作

  if (nchildren > 8 && 
      std::ranges::all_of(std::views::iota(0, 8), 
                          [parent](auto i) { return parent->isChildValid(i); })
  ) {

  }
Run Code Online (Sandbox Code Playgroud)