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

C++:如何实现类似std::all_of的索引范围遍历验证功能

替代std::all_of实现索引范围验证的方案

问题描述

我正在重构一段现有代码,当前代码如下:

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

}

这段代码会对索引范围[0:7]内的每个i,调用8次parent->isChildValid(i)进行验证。作为练习,我希望找到一种更灵活的实现方式(方便后续修改范围),类似std::all_of的功能,但std::all_of仅支持带迭代器的结构,因此如下写法无法生效:

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

我想了解是否存在类似的替代方案,要求无需声明vector并填充{0,1,2,3,4,5,6,7}这类容器,且能直接指定索引的最小和最大值进行遍历验证。另外,我无法使用Boost库。


解决方案

方案1:自定义范围版all_of函数

自己实现一个接收起始、结束索引和谓词的模板函数,逻辑和std::all_of一致,遍历指定索引范围即可:

template<typename Func>
bool all_of_range(int start, int end, Func func) {
    for (int i = start; i <= end; ++i) {
        if (!func(i)) {
            return false;
        }
    }
    return true;
}

使用方式:

if (nchildren > 7 && all_of_range(0, 7, [&](int i){ return parent->isChildValid(i); })) {
    // 原有业务逻辑
}

该方案灵活度高,后续修改验证范围只需调整start和end参数,且能在所有C++版本中使用。

方案2:C++20范围库(若支持)

C++20的范围库提供了std::views::iota,可以生成连续整数序列,配合std::ranges::all_of无需额外容器即可实现需求:

#include <ranges>
#include <algorithm>

// ...

if (nchildren > 7 && std::ranges::all_of(std::views::iota(0, 8), [&](int i){ return parent->isChildValid(i); })) {
    // 原有业务逻辑
}

注意std::views::iota是左闭右开区间,因此验证0~7时,第二个参数需传入8。

方案3:极简手动循环

如果不需要复用逻辑,直接用一个简单循环封装验证逻辑即可,写法直观且无依赖:

bool allChildrenValid = true;
for (int i = 0; i <= 7; ++i) {
    if (!parent->isChildValid(i)) {
        allChildrenValid = false;
        break;
    }
}
if (nchildren > 7 && allChildrenValid) {
    // 原有业务逻辑
}

内容的提问来源于stack exchange,提问作者user18490

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:01:40