<QtTypeTraits> - Qt Type Traits
Funcionalidad para rasgos de tipo y transformaciones. Más...
| Header: | #include <QtTypeTraits> |
| Since: | Qt 6.5 |
Funciones
| T | qExchange(T &obj, U &&newValue) |
(since 6.2) std::underlying_type_t<Enum> | qToUnderlying(Enum e) |
Macros
(since 6.8) | QT_NO_QASCONST |
(since 6.6) | QT_NO_QEXCHANGE |
Documentación de funciones
[constexpr noexcept(...)] template <typename T, typename U = T> T qExchange(T &obj, U &&newValue)
Sustituye el valor de obj por newValue y devuelve el valor antiguo de obj.
Esta es la implementación de Qt de std::exchange(). Difiere de std::exchange() sólo en que es constexpr ya antes de C++20 y noexcept ya antes de C++23.
Recomendamos encarecidamente utilizar std::exchange() cuando no se necesiten las variantes C++20 o C++23. Puede hacer que qExchange() no esté disponible definiendo la macro QT_NO_QEXCHANGE.
A continuación se muestra cómo utilizar qExchange() para implementar constructores de movimiento:
MyClass(MyClass &&other) : m_pointer{qExchange(other.m_pointer, nullptr)}, m_int{qExchange(other.m_int, 0)}, m_vector{std::move(other.m_vector)}, ...
Para miembros de tipo clase, podemos usar std::move(), ya que su constructor move hará lo correcto. Pero para tipos escalares como punteros sin formato o tipo entero, move es lo mismo que copy, lo cual, particularmente para punteros, no es lo que esperamos. Por lo tanto, no podemos usar std::move() para esos tipos, pero podemos usar std::exchange()/qExchange() para asegurarnos de que el miembro del objeto fuente ya está reseteado cuando lleguemos a la inicialización de nuestro siguiente miembro de datos, lo que puede ser útil si el constructor sale con una excepción.
He aquí cómo utilizar qExchange() para escribir un bucle que consuma la colección sobre la que itera:
for (auto &e : qExchange(collection, {}) doSomethingWith(e);
Lo que equivale al siguiente código, mucho más verboso:
{
auto tmp = std::move(collection);
collection = {}; // or collection.clear()
for (auto &e : tmp)
doSomethingWith(e);
} // destroys 'tmp'Esto es perfectamente seguro, ya que el bucle for mantiene vivo el resultado de qExchange() mientras se ejecuta el bucle, guardando la declaración de una variable temporal. Tenga en cuenta, sin embargo, que qExchange() devuelve un objeto no-const, por lo que los contenedores Qt pueden desprenderse.
Nota: Esta función es noexcept cuando std::conjunction_v<std::is_nothrow_move_constructible<T>,
std::is_nothrow_assignable<T &, U>> es true.
[constexpr noexcept, since 6.2] template <typename Enum> std::underlying_type_t<Enum> qToUnderlying(Enum e)
Convierte el enumerador e al valor equivalente expresado en el tipo subyacente de su enumeración.
Esta función se introdujo en Qt 6.2.
Documentación de macros
[since 6.8] QT_NO_QASCONST
Definir esta macro elimina la disponibilidad de la función qAsConst().
Esta macro se introdujo en Qt 6.8.
Véase también qAsConst.
[since 6.6] QT_NO_QEXCHANGE
Definir esta macro elimina la disponibilidad de la función qExchange().
Esta macro se introdujo en Qt 6.6.
Véase también qExchange.
© 2026 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.