К моему удивлению, я только что обнаружил, что следующий код не компилируется из коробки в C ++ 14 с использованием Qt 5.4:
QSet<std::shared_ptr<SomeType>> var;
Проблема в том, что нет перегрузки qHash()
метод для std::shared_ptr
или любой другой умный указатель, насколько я вижу:
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. Нужно ли включать специальный заголовок? Какова причина, почему это не существует?
Говори о дьяволе, и он явится:
https://codereview.qt-project.org/113340
Это не может быть просто то, что пропустили разработчики Qt.
Это не упущение, просто Qt не имеет бесконечных ресурсов для добавления qHash
перегрузки к любому типу STL, который имеет operator==
,
Это не может быть просто то, что пропустили разработчики Qt.
Это так, и это не то, что упустили из виду — просто невозможно написать весь код сразу. Нужно где-то остановиться и сделать релиз. Не стесняйтесь представить ревизию кода, которая исправит это 🙂 Убедитесь, что ревизия будет собираться на всех платформах и со всеми поддерживаемыми компиляторами — некоторые из них имеют библиотеки без std::shared_ptr
!