有标准函数可以做到这一点吗? bind_front,然后用 0 来制作 vs;

问题描述 投票:0回答:1

我正在使用 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 或函数重载?

c++
1个回答
0
投票

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
以查看是否存在任何非零值。

© www.soinside.com 2019 - 2024. All rights reserved.