C ++ - 函数对象" equal_to"与"运营商=="

时间:2014-12-10 12:07:11

标签: c++

鉴于程序员定义的POD struct将存储在unordered_map中,定义是否有任何特别的优势:

namespace std {
    template<>
    struct equal_to<MyType> {
        bool operator()(const MyType& lhs, const MyType& rhs) const {
            ...
        }
    };
}

简单定义:

operator==(const MyType& lhs, const MyType& rhs)

(我已经意识到使用“可内联”函数对象而不是散列函数的函数指针的潜在优势。)

2 个答案:

答案 0 :(得分:3)

我认为operator==equal_to<>的专精更有用,因为人们通常会写a == b,而不是equal_to<T>()(a, b)。默认equal_to<>是根据operator==实现的,而不是相反。

如果您需要专门化std::equal_to因为它必须与operator==的行为不同,那么更好的想法可能是实现与{{1}无关的自定义my_equal_to谓词类为了遵循最小惊喜的原则。

此外,std::equal_to中存在接口不足,因为它接受相同类型的参数。 C ++ 14 std::equal_to<T>通过接受不同类型的参数并将它们转发到std::equal_to<void>来修复缺陷。

另一方面,

operator==可以针对不同类型进行多次重载(例如operator==)。

这意味着在C ++ 14中operator==(std::string const&, char const*)和重载的std::equal_to<void>可以很好地协同工作,有关详细信息,请参阅N3657 Adding heterogeneous comparison lookup to associative containers

  

我已经意识到使用&#34; inlineable&#34;函数对象而不是散列函数的函数指针

函数指针不适用于此处,默认operator==直接使用equal_to<>,而不是通过指针。

答案 1 :(得分:0)

如果您有一个类层次结构并希望在子类的两个对象上使用父类的equal_to,则可以使用equal_to - 变体,而不是{{1} } variant(将选择子类的comperator):