我最近遇到了一种情况,我需要将一系列的布尔值“或”在一起。
一个例子可能是std::vector<bool> bools;
我想出了一些将它们全部组合在一起的不同方法:
std::any_of(bools.begin(), bools.end(), [](bool x) { return x; } )
或
std::find(bools.begin(), bools.end(), true) != bools.end()
或
std::accumulate(bools.begin(), bools.end(), false, std::logical_or);
或
std::accumulate(bools.begin(), bools.end(), 0) != 0;
如果长度是固定的,那么我可以使用具有std::bitset
功能的any
-但这只是一个选择。
在所有这些方法中,它们都不是非常直观的,或者在这里并没有真正表达出意图(以较小的方式,它们都显示了某种“ WTF?代码”)
这种情况具有讽刺意味的是,对于variadic-templates,我们确实有fold-expression,相比之下,它们boost简单而富有表现力:
(bools || ...)
注意:我确实有dataset,其中包含范围库,但AFAIK并不能真正缓解此问题。