我正在使用 C++20 的范围并尝试使我的代码更加简洁。具体来说,我有以下代码,使用
std::bind_front
检查 std::map<int, int>
中的所有值是否等于 0
:
return ranges::all_of(views::values(m), std::bind_front(std::ranges::equal_to(), 0));
虽然这可行,但我想让代码更加紧凑。我知道我可以使用 lambda 或创建函数重载来实现相同的结果,但我想避免这些方法。我正在寻找一种可以缩短代码而不引入 lambda 或其他函数重载的解决方案。
有没有办法直接缩短代码,可能使用
std::apply
或其他 C++20 功能,而不诉诸 lambda 或函数重载?
all_of
和其他算法已经可以将 int
转换为 bool
。使用的谓词是 std::identity
:
#include <map>
#include <ranges>
#include <algorithm>
#include <functional>
#include <iostream>
bool foo(const auto& m){
return !std::ranges::any_of(
std::views::values(m),
std::identity{});
}
int main() {
std::map<int,int> m1 {{1,0},{2,0}};
std::cout << foo(m1);
std::map<int,int> m2 {{1,1},{2,2}};
std::cout << foo(m2);
std::map<int,int> m3 {{1,0},{2,2}};
std::cout << foo(m3);
}
输出:
100
请注意,我将
all_of
替换为 !any_of
以查看是否存在任何非零值。