<QtTypeTraits> - Qt Type Traits
Funktionalität für Type Traits und Transformationen. Mehr...
Header: | #include <QtTypeTraits> |
Since: | Qt 6.5 |
Funktionen
T | qExchange(T &obj, U &&newValue) |
(since 6.2) std::underlying_type_t<Enum> | qToUnderlying(Enum e) |
Makros
(since 6.8) | QT_NO_QASCONST |
(since 6.6) | QT_NO_QEXCHANGE |
Dokumentation der Funktionen
[constexpr noexcept(...)]
template <typename T, typename U = T> T qExchange(T &obj, U &&newValue)
Ersetzt den Wert von obj durch newValue und gibt den alten Wert von obj zurück.
Dies ist Qts Implementierung von std::exchange(). Sie unterscheidet sich von std::exchange() nur dadurch, dass sie constexpr
bereits vor C++20 und noexcept bereits vor C++23 ist.
Wir empfehlen dringend, std::exchange() zu verwenden, wenn Sie die C++20- oder C++23-Varianten nicht benötigen. Sie können qExchange() nicht verfügbar machen, indem Sie das Makro QT_NO_QEXCHANGE definieren.
Hier sehen Sie, wie Sie qExchange() zur Implementierung von Move-Konstruktoren verwenden:
MyClass(MyClass &&other) : m_pointer{qExchange(other.m_pointer, nullptr)}, m_int{qExchange(other.m_int, 0)}, m_vector{std::move(other.m_vector)}, ...
Für Mitglieder von Klassentypen können wir std::move() verwenden, da ihr move-Konstruktor das Richtige tun wird. Aber für skalare Typen wie rohe Zeiger oder Integer-Typen ist move dasselbe wie copy, was, insbesondere für Zeiger, nicht das ist, was wir erwarten. Daher können wir std::move() für solche Typen nicht verwenden, aber wir können std::exchange()/qExchange() verwenden, um sicherzustellen, dass der Member des Quellobjekts bereits zurückgesetzt ist, wenn wir zur Initialisierung unseres nächsten Datenmembers kommen, was sich als nützlich erweisen könnte, wenn der Konstruktor mit einer Ausnahme beendet wird.
Hier sehen Sie, wie Sie qExchange() verwenden, um eine Schleife zu schreiben, die die Sammlung, über die sie läuft, verbraucht:
for (auto &e : qExchange(collection, {}) doSomethingWith(e);
Das entspricht dem folgenden, viel ausführlicheren Code:
{ auto tmp = std::move(collection); collection = {}; // or collection.clear() for (auto &e : tmp) doSomethingWith(e); } // destroys 'tmp'
Dies ist vollkommen sicher, da die for-Schleife das Ergebnis von qExchange() so lange aufrechterhält, wie die Schleife läuft, und die Deklaration einer temporären Variablen speichert. Seien Sie sich jedoch bewusst, dass qExchange() ein nicht-konstantes Objekt zurückgibt, so dass sich Qt-Container ablösen können.
Hinweis: Diese Funktion ist noexcept, wenn std::conjunction_v<std::is_nothrow_move_constructible<T>,
std::is_nothrow_assignable<T &, U>>
true
ist.
[constexpr noexcept, since 6.2]
template <typename Enum> std::underlying_type_t<Enum> qToUnderlying(Enum e)
Konvertiert den Enumerator e in den äquivalenten Wert, der im zugrunde liegenden Typ der Enumeration ausgedrückt ist.
Diese Funktion wurde in Qt 6.2 eingeführt.
Makro-Dokumentation
[since 6.8]
QT_NO_QASCONST
Durch die Definition dieses Makros wird die Verfügbarkeit der Funktion qAsConst() aufgehoben.
Dieses Makro wurde in Qt 6.8 eingeführt.
Siehe auch qAsConst.
[since 6.6]
QT_NO_QEXCHANGE
Durch die Definition dieses Makros wird die Verfügbarkeit der Funktion qExchange() aufgehoben.
Dieses Makro wurde in Qt 6.6 eingeführt.
Siehe auch qExchange.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.