自定义Node类适配std::unordered_map:关于同时实现静态equal方法与==运算符重载的疑问
自定义Node类适配std::unordered_map:关于同时实现静态equal方法与==运算符重载的疑问
嗨,我完全懂你现在的处境——为了让自定义的Node类能在std::unordered_map<std::shared_ptr<Node>, double, Node::Hash, Node::Compare>里正常工作,你发现自己不得不同时实现静态的equal方法和operator==重载,对吧?
其实这么做的核心原因是代码复用和接口一致性:
- 首先,
std::unordered_map的第四个模板参数是键的相等比较器(你这里用的Node::Compare),它需要能判断两个Node对象的内容是否相等(而不是默认的比较指针地址)。你写的静态equal方法,应该是给这个比较器提供核心的相等判断逻辑——比如你的Comparefunctor大概率是这样实现的:struct Compare { bool operator()(const std::shared_ptr<Node>& lhs, const std::shared_ptr<Node>& rhs) const { return Node::equal(*lhs, *rhs); } }; - 而重载
operator==,则是为了让你的Node类在其他场景下也能符合C++的常规用法——比如直接比较两个Node实例,或者手动解引用shared_ptr<Node>后用==判断时,行为是符合预期的。同时让operator==调用静态equal,也保证了所有相等判断的逻辑是统一的,不会出现“比较器判断相等但直接用==却不等”的矛盾情况。
当然,你也可以把逻辑反过来,先实现operator==,再让静态equal调用它,效果是一样的:
bool operator==(const Node &other) const { return this->q == other.q; } static bool equal(const Node &a, const Node &b) { return a == b; }
如果你的equal方法只给比较器用,其实也可以直接把判断逻辑写在Compare functor里,但这样会导致相等逻辑被耦合在比较器中,没法在其他地方复用,所以抽出一个独立的静态方法(或者成员方法)是更优雅的做法。
备注:内容来源于stack exchange,提问作者raaj
相关产品推荐
相关产品推荐

