std::identity
De cppreference.com
<tbody>
</tbody>
| 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.
Tipos miembro
| Tipo miembro | Definición |
is_transparent
|
/* no especificada */ |
Funciones miembro
| Devuelve su argumento sin cambiarlo. (función miembro pública) |
std::identity::operator()
<tbody> </tbody> 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).
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.
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 }
Véase también
(C++20) |
Devuelve el argumento del tipo sin modificarlo. (plantilla de clase) |