为啥 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_ptrqHash() 方法没有重载,据我所知,没有任何其他智能指针: 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 的重载?的主要内容,如果未能解决你的问题,请参考以下文章

QHash 在不同的 qt 版本中表现不同

Qt ------- QMap和QHash的区别

QSet使用及Qt自定义类型使用QHash等算法

Qt入门系列开发教程STL篇QHash哈希表使用方法

Qt6STL-QMap分析

QMap 与 QHash