为啥 Qt 的 qHash() 没有 std::shared_ptr 的重载?
Posted
技术标签:
【中文标题】为啥 Qt 的 qHash() 没有 std::shared_ptr 的重载?【英文标题】:Why doesn't Qt's qHash() have an overload for std::shared_ptr?为什么 Qt 的 qHash() 没有 std::shared_ptr 的重载? 【发布时间】:2015-05-29 14:06:16 【问题描述】:令我惊讶的是,以下代码在使用 Qt 5.4 的 C++14 中无法立即编译:
QSet<std::shared_ptr<SomeType>> var;
问题在于std::shared_ptr
的qHash()
方法没有重载,据我所知,没有任何其他智能指针:
http://doc.qt.io/qt-5/qhash.html#related-non-members
对我来说,有以下重载(或类似的东西)似乎很自然:
template <typename T>
uint qHash(const std::shared_ptr<T>& ptr, uint seed = 0)
return qHash(ptr.get(), seed);
但它不存在。这不能简单地是 Qt 开发人员忽略的事情。我需要包含一个特殊的标题吗?这不存在的原因是什么?
【问题讨论】:
混合 Qt 的 set 类和 std 的智能指针类有充分的理由吗?为什么不std::unordered_set
?
【参考方案1】:
说到魔鬼,他就出现了: https://codereview.qt-project.org/113340
这不能简单地被 Qt 开发人员所忽视。
这不是一个小问题,只是 Qt 没有无穷无尽的资源可以将 qHash
重载添加到任何具有 operator==
的 STL 类型。
【讨论】:
非常感谢@peppe。您是否将这些重载添加到 Qt 中?也非常感谢:) 只是即使 Qt 的资源有限,但它的润色、成熟度和令人敬畏的程度让我无法期待一切(并且几乎总是得到它:D)。【参考方案2】:这不能简单地被 Qt 开发人员忽视。
确实如此,而且没有被忽视 - 一次编写所有代码是不可能的。一个人必须在某个地方停下来做一个释放。随时提交可以解决此问题的代码修订版 :) 不过,请确保该修订版将在所有平台上构建,并使用所有受支持的编译器 - 其中一些具有没有 std::shared_ptr
的库!
【讨论】:
以上是关于为啥 Qt 的 qHash() 没有 std::shared_ptr 的重载?的主要内容,如果未能解决你的问题,请参考以下文章