C++无逻辑与赋值操作符,累积布尔值的常用惯用写法是什么?
C++累积逻辑与的惯用替代写法
针对你提到的累积布尔值逻辑与的冗余写法,行业内最常用且受认可的替代方案主要有以下几种:
1. 使用标准库算法 std::all_of
这是最符合现代C++风格的方案,适用于迭代器可遍历的序列场景。比如你示例中的循环部分,可以直接替换为:
#include <algorithm> // ... bool all_ok = std::all_of(arr.begin(), arr.end(), [&](const auto& elem) { return elem == expected(get_index(&elem - arr.begin())); });
如果是零散的多个条件而非序列,也可以将条件包装进一个初始化列表,结合std::all_of简化:
bool all_ok = std::all_of({ (foo() == GoodFoo), (bar * baz > 3), quux() }, [](bool cond) { return cond; });
std::all_of会利用逻辑与的短路特性:一旦遇到第一个false,就会停止后续条件的计算,和你原来的手动累积行为完全一致。
2. 自定义短路累积函数
如果需要更灵活的调用方式,可以封装一个支持短路逻辑的inline函数:
inline void accumulate_and(bool& target, bool condition) { if (target) { target = condition; } } // 使用方式 bool all_ok = true; accumulate_and(all_ok, foo() == GoodFoo); accumulate_and(all_ok, bar * baz > 3); accumulate_and(all_ok, quux()); for (int i = 1; i < n; i++) { accumulate_and(all_ok, arr[get_index(i)] == expected(i)); }
这种写法避免了重复的all_ok = all_ok and ...,同时保留了短路求值的特性。
3. 宏定义(谨慎使用)
虽然宏可以实现更简洁的写法,但由于宏的文本替换特性容易引发意外问题(比如表达式副作用),仅在明确场景下使用:
#define AND_ACCUM(target, cond) do { if (target) target = (cond); } while(0) // 使用方式 bool all_ok = true; AND_ACCUM(all_ok, foo() == GoodFoo); AND_ACCUM(all_ok, bar * baz > 3); // ...
这里用do-while(0)包裹是为了避免宏在复杂语句块中出现语法错误。
其中,std::all_of是最推荐的方案,它符合C++标准库的设计理念,代码可读性和可维护性都更高,也是行业内最广泛认可的写法。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

