0

我正在探索范围函数。

struct User
{
    std::string name;
    int age;
    std::string gender;

    template<class Os> friend
        Os& operator<<(Os& os, User const& u)
    {
        return os << "\n" << std::right << std::setw(10)
            << u.name << " - " << u.age << ", " << u.gender;
    }
};

std::vector<User> users = {
    {"Dorothy", 59, "F"},
    {"Allan", 60, "M"},
    {"Kenny", 33, "M"},
    {"Jaye", 30, "F"}
};

int main()
{
    std::cout << "Count of M users: " <<
         std::ranges::count_if(users, [](const User& u) {return u.gender == "M"; }) << 
         std::endl;
    
    const User match { "Ed", 44, "M" };

    std::cout << "Count of Ed users: " <<
         std::ranges::count(users, match) <<
         std::endl;
}

count_if 按预期运行。计数表达式在 MSVS 2019 中生成错误。

错误 C7602 'std::ranges::_Count_fn::operator ()': 不满足关联的约束 D:\Test\Code\Ranges\Ranges.cpp

它指向我的标准算法头。我显然不理解为 count 函数列出的唯一约束的indirect_binary_predicate。阅读 cppreference.com 是……没有帮助:-)。

我在这里想念什么?

4

1 回答 1

1

std::ranges::count_if您提供自定义比较器时。但是,在std::ranges::count您尝试使用默认比较时,它不会。

您需要提供它,并且假设您想要对结构成员进行逐个比较,您可以简单地添加:

auto operator<=>(User const &) const = default;

到你的结构。

如果您想要不同类型的比较,则必须指定它而不是使用= default.

于 2021-02-28T00:21:53.110 回答