繁体   English   中英

什么是 range/v3/functional/comparisons.hpp?

[英]What is range/v3/functional/comparisons.hpp for?

这个 header 是做什么用的

举个例子,它定义了equal_to

namespace ranges
{
    /// \addtogroup group-functional
    /// @{
    struct equal_to
    {
        template(typename T, typename U)(
            /// \pre
            requires equality_comparable_with<T, U>)
        constexpr bool operator()(T && t, U && u) const
        {
            return (T &&) t == (U &&) u;
        }
        using is_transparent = void;
    };

    // ... and the others, such as !=, <, <=, ...
}

但是ranges::equal_to对于std::equal_to的优势是什么? 仅在实例化 class 的 object 时保存<> ,即编写ranges::equal_to{}而不是std::equal_to<>{}

ranges::equal_tostd::equal_to有什么优势? 仅在实例化其 class 的 object 时保存<> ,即写入ranges::equal_to{}而不是std::equal_to<>{}

这是不正确的,因为从 C++17 开始就允许省略空的<>


什么是range/[...]/comparisons.hpp

ranges:: comparison function 对象和基本版本之间的主要区别在于,由于要求equality_comparable_with<T, U>ranges版本受到更多限制。 同样的区别也适用于std::版本和 C++20 std::ranges::版本。


要使std::equal_to{}(a, b)成为有效代码,您只需要a == b成为有效代码。

但是, ranges::equal_to{}(a, b)成为有效代码, ab必须满足equality_comparable要求。 这意味着不仅a == b需要有效, ab之间的所有相等性检查也必须是有效代码(包括自我比较),其中包括:

a == a;
a != a;
b == b;
b != b;
a == b;
a != b;
b == a;
b != a;

同时, ab之间也必须有一个公共类型C ,其中c == cc != c都是有效代码。


在其他ranges:: comparison function 对象上可以观察到类似的行为,例如ranges::not_equal_toranges::less

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM