鉴于程序员定义的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)
(我已经意识到使用“可内联”函数对象而不是散列函数的函数指针的潜在优势。)
答案 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):