Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
std::identity (introducido en C++20) es un objeto de función cuyo operator() argumento devuelve sin cambios.
Nota:
Hay una estructura identity específica de Microsoft de Microsoft de <utility> que está en desuso y no está disponible en versiones posteriores de Visual Studio. Para C++20 y versiones posteriores, use std::identity desde <functional> en su lugar, que es el equivalente conforme al estándar que se describe a continuación.
std::identity (C++20)
Muchas API de biblioteca estándar toman un argumento invocable, como una función de proyección o transformación. Si necesita pasar una llamada a , pero no desea cambiar los datos, pase std::identity. Esto es común en los algoritmos de intervalos. Muchas <algorithm> sobrecargas de intervalos tienen un parámetro de proyección que tiene std::identity{}como valor predeterminado .
Sintaxis
struct identity
{
template <class T>
_NODISCARD constexpr T&& operator()(T&& t) const noexcept;
using is_transparent = int;
};
Comentarios
El is_transparent tipo de miembro es una etiqueta que marca std::identity como un objeto de función transparente. Su presencia indica que los algoritmos pueden realizar comparaciones o proyecciones sin necesidad de convertir tipos en un formulario común primero. Esto es útil para contenedores y algoritmos asociativos que admiten búsquedas heterogéneas, lo que les permite comparar tipos diferentes directamente sin construir objetos temporales.
Ejemplos
#include <algorithm>
#include <functional>
#include <iostream>
#include <ranges>
#include <vector>
int main()
{
std::vector<int> v{3, 1, 4, 1, 5, 9, 2, 6};
// Ranges algorithms can apply a projection before comparison.
// But if you don't want to apply a projection, i.e. you don't want to modify the data
// before comparison, you can use std::identity to leave each element unchanged.
// Here, std::identity{} means "project each element as itself".
// So the comparator sees the original int values unchanged.
std::ranges::sort(v, std::less{}, std::identity{});
// This call is equivalent because std::identity{} is the default projection.
// In both calls, elements are sorted directly; no field extraction or
// value transformation happens first.
std::ranges::sort(v);
for (int n : v)
{
std::cout << n << ' ';
}
std::cout << '\n';
// Output: 1 1 2 3 4 5 6 9
}
En este ejemplo se busca una std::vector<std::string> clase con una std::string_view clave. Dado que std::identity tiene el is_transparent miembro , el algoritmo sabe comparar estos tipos directamente. De este modo, la clave no se convierte en temporal std::string para realizar la comparación.
#include <algorithm>
#include <functional>
#include <iostream>
#include <ranges>
#include <string>
#include <string_view>
#include <vector>
int main()
{
std::vector<std::string> words{"apple", "banana", "cherry", "date"};
std::string_view key = "cherry";
// `std::less<>` is transparent, so it can compare `std::string` and
// `std::string_view` directly.
// `std::identity` is also marked transparent (`is_transparent`), so the
// projection stays type-flexible instead of forcing one fixed type.
auto it = std::ranges::lower_bound(words, key, std::less<>{}, std::identity{});
if (it != words.end() && *it == key)
{
std::cout << "Found: " << *it << '\n';
}
}