std::reference_wrapper
| Definido en el encabezado <functional>
|
||
template< class T >
class reference_wrapper;
|
(desde C++11) | |
std::reference_wrapper es una plantilla de clase que envuelve una referencia en un objeto copiable y asignable.
Específicamente, std::reference_wrapper es un envoltorio CopyConstructible y CopyAssignable alrededor de una referencia a un objeto o referencia a una función de tipo T. Las instancias de std::reference_wrapper son objetos (se pueden copiar o almacenar en contenedores) pero son implícitamente convertibles a T&, de modo que se pueden usar como argumentos con funciones que toman el tipo subyacente por referencia.
Si la referencia almacenada es Callable, std::reference_wrapper es invocable con los mismos argumentos.
Las funciones auxiliares std::ref y std::cref se usan a menudo para generar objetos std::reference_wrapper.
std::reference_wrapper se usa para pasar objetos por referencia a std::bind, al constructor de std::thread, o a las funciones auxiliares std::make_pair y std::make_tuple. También se puede usar como un mecanismo para almacenar referencias dentro de contenedores estándar (como std::vector) que normalmente no pueden contener referencias.
|
|
(desde C++17) |
|
|
(desde C++20) |
Tipos de miembros
| tipo | definición |
type
|
T
|
result_type
(obsoleto en C++17) (eliminado en C++20) |
El tipo de retorno de
T
si
T
es una función. En caso contrario, no está definido.
|
argument_type
(obsoleto en C++17) (eliminado en C++20) |
|
first_argument_type
(obsoleto en C++17) (eliminado en C++20) |
|
second_argument_type
(obsoleto en C++17) (eliminado en C++20) |
|
Funciones miembro
|
almacena una referencia en un nuevo objeto
std::reference_wrapper
(función miembro pública) |
|
|
reasigna un
std::reference_wrapper
(función miembro pública) |
|
|
accede a la referencia almacenada
(función miembro pública) |
|
|
llama a la función almacenada
(función miembro pública) |
Funciones no miembro
|
(C++26)
|
compara
reference_wrapper
objetos como sus referencias almacenadas
(función) |
Guías de deducción (desde C++17)
Clases auxiliares
determina el tipo de referencia común de
reference_wrapper
y no-
reference_wrapper
(especialización de plantilla de clase) |
Implementación posible
namespace detail { template<class T> constexpr T& FUN(T& t) noexcept { return t; } template<class T> void FUN(T&&) = delete; } template<class T> class reference_wrapper { public: // tipos using type = T; // construir/copiar/destruir template<class U, class = decltype( detail::FUN<T>(std::declval<U>()), std::enable_if_t<!std::is_same_v<reference_wrapper, std::remove_cvref_t<U>>>() )> constexpr reference_wrapper(U&& u) noexcept(noexcept(detail::FUN<T>(std::forward<U>(u)))) : _ptr(std::addressof(detail::FUN<T>(std::forward<U>(u)))) {} reference_wrapper(const reference_wrapper&) noexcept = default; // asignación reference_wrapper& operator=(const reference_wrapper& x) noexcept = default; // acceso constexpr operator T& () const noexcept { return *_ptr; } constexpr T& get() const noexcept { return *_ptr; } template<class... ArgTypes> constexpr std::invoke_result_t<T&, ArgTypes...> operator() (ArgTypes&&... args ) const noexcept(std::is_nothrow_invocable_v<T&, ArgTypes...>) { return std::invoke(get(), std::forward<ArgTypes>(args)...); } private: T* _ptr; }; // guías de deducción template<class T> reference_wrapper(T&) -> reference_wrapper<T>; |
Ejemplo
Demuestra el uso de
std::reference_wrapper
como contenedor de referencias, lo que permite acceder al mismo contenedor usando múltiples índices.
#include <algorithm> #include <functional> #include <iostream> #include <list> #include <numeric> #include <random> #include <vector> void println(auto const rem, std::ranges::range auto const& v) { for (std::cout << rem; auto const& e : v) std::cout << e << ' '; std::cout << '\n'; } int main() { std::list<int> l(10); std::iota(l.begin(), l.end(), -4); // can't use shuffle on a list (requires random access), but can use it on a vector std::vector<std::reference_wrapper<int>> v(l.begin(), l.end()); std::ranges::shuffle(v, std::mt19937{std::random_device{}()}); println("Contents of the list: ", l); println("Contents of the list, as seen through a shuffled vector: ", v); std::cout << "Doubling the values in the initial list...\n"; std::ranges::for_each(l, [](int& i) { i *= 2; }); println("Contents of the list, as seen through a shuffled vector: ", v); }
Salida posible:
Contents of the list: -4 -3 -2 -1 0 1 2 3 4 5 Contents of the list, as seen through a shuffled vector: -1 2 -2 1 5 0 3 -3 -4 4 Doubling the values in the initial list... Contents of the list, as seen through a shuffled vector: -2 4 -4 2 10 0 6 -6 -8 8
Véase también
|
(C++11)
(C++11)
|
crea un
std::reference_wrapper
con un tipo deducido de su argumento
(plantilla de función) |
|
(C++11)
|
vincula uno o más argumentos a un objeto función
(plantilla de función) |
|
(C++20)
(C++20)
|
obtiene el tipo de referencia encapsulado en
std::reference_wrapper
(plantilla de clase) |