std::identity
De cppreference.com
< cpp | utility | functional
Definido en el archivo de encabezado <functional>
|
||
struct identity; |
(desde C++20) | |
std::identity
es un objeto función cuyo operador operator() devuelve su argumento sin cambiarlo.
Contenido |
[editar] Tipos miembro
Tipo miembro | Definición |
is_transparent
|
/* no especificada */ |
[editar] Funciones miembro
operator() |
Devuelve su argumento sin cambiarlo. (función miembro pública) |
std::identity::operator()
template< class T> constexpr T&& operator()( T&& t ) const noexcept; |
||
Devuelve std::forward<T>(t).
Parámetros
t | - | Argumento a devolver. |
Valor de retorno
std::forward<T>(t).
[editar] Notas
El tipo miembro is_transparent
indica al llamante que este objeto función es un objeto función transparente: acepta argumentos de tipos arbitrarios y utiliza un reenvío perfecto, lo que evita la copia y conversión innecesarias cuando el objeto función se utiliza en un contexto heterogéneo o con argumentos r-valor. En particular, las funciones de plantilla como std::set::find y std::set::lower_bound hacen uso de este tipo miembro en sus tipos Compare
.
std::identity
sirve como la proyección por defecto en los algoritmos restringidos. Su uso directo no suele ser necesario.
[editar] Ejemplo
Ejecuta este código
#include <algorithm> #include <functional> #include <iostream> #include <ranges> #include <string> #include <vector> struct Par { int n; std::string s; friend std::ostream& operator<< (std::ostream& os, const Par& p) { return os << "{ " << p.n << ", " << p.s << " }"; } }; // Una función de impresión de rangos que puede imprimir // los elementos proyectados (modificados) de un rango. template <std::ranges::input_range R, typename Proyeccion = std::identity> //<- Nótese la proyección por defecto void imprimir(std::string_view const comentario, R&& r, Proyeccion proy = {}) { std::cout << comentario << "{ "; std::ranges::for_each(r, [](const auto& o){ std::cout << o << ' '; }, proy); std::cout << "}\n"; } int main() { const std::vector<Par> v{ {1, "uno"}, {2, "dos"}, {3, "tres"} }; imprimir("Imprimir usando std::identity como una proyección: ", v); imprimir("Proyectar el Par::n: ", v, &Par::n); imprimir("Proyectar el Par::s: ", v, &Par::s); imprimir("Imprimir usando un cierre personalizado como una proyección: ", v, [](Par const& p) { return std::to_string(p.n) + ':' + p.s; }); }
Salida:
Imprimir usando std::identity como una proyección: { { 1, uno } { 2, dos } { 3, tres } } Proyectar el Par::n: { 1 2 3 } Proyectar el Par::s: { uno dos tres } Imprimir usando un cierre personalizado como una proyección: { 1:uno 2:dos 3:tres }
[editar] Véase también
(C++20) |
Devuelve el argumento del tipo sin modificarlo. (plantilla de clase) |