C++20中如何更简洁地判断std::map所有值为0(不使用lambda或额外函数重载)
C++20中如何更简洁地判断std::map所有值为0(不使用lambda或额外函数重载)
嘿,刚好折腾过类似的场景,给你俩纯C++20的简洁写法,完全符合你“不用lambda也不额外写函数重载”的要求:
方案一:用
std::ranges::equal结合views::repeat
这个写法我个人特别推荐,超直观——直接把map的所有值,和一个无限输出0的范围做比较。因为我们的values范围是有限的,ranges::equal会挨个比完所有元素,和你原来用all_of的效果一模一样,但代码短多了:return ranges::equal(views::values(m), views::repeat(0));方案二:简化原有的
bind_front写法
要是你习惯用all_of的逻辑,也可以稍微简化谓词部分——C++20里std::equal_to本身就是透明比较器,和std::ranges::equal_to在这个场景下没区别,所以可以把前缀简化,代码会短一点:return ranges::all_of(views::values(m), std::bind_front(std::equal_to{}, 0));
这两个方案完全依赖C++20标准库特性,不需要写任何自定义代码,完美避开了lambda和额外函数重载的限制。
备注:内容来源于stack exchange,提问作者Yan
相关产品推荐
相关产品推荐

