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
相关产品推荐
相关产品推荐

