Espacios de nombres
Variantes
Acciones

std::identity

De cppreference.com
< cpp‎ | utility‎ | functional
 
 
Biblioteca de servicios
 
Objetos función
Envoltorios de funciones
(C++11)
(C++11)
Aplicación parcial de funciones
(C++20)
(C++11)
Invocación de funciones
(C++17)(C++23)
Objeto función identidad
identity
(C++20)
Envoltorios de referencias
(C++11)(C++11)
Envoltorios de operador transparentes
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
Negadores
(C++17)
Buscadores
Comparadores restringidos
Vinculadores y adaptadores antiguos
(hasta C++17)
(hasta C++17)
(hasta C++17)
(hasta C++17)
(hasta C++17)(hasta C++17)(hasta C++17)(hasta C++17)
(hasta C++20)
(hasta C++20)
(hasta C++17)(hasta C++17)
(hasta C++17)(hasta C++17)

(hasta C++17)
(hasta C++17)(hasta C++17)(hasta C++17)(hasta C++17)
(hasta C++20)
(hasta C++20)
 
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

#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

Devuelve el argumento del tipo sin modificarlo.
(plantilla de clase) [editar]