std::identity
| Определено в заголовочном файле <functional>
|
||
struct identity; |
(начиная с C++20) | |
std::identity это тип объекта функции, operator() которого возвращает свой аргумент без изменений.
Типы элементы
| Тип элемент | Определение |
is_transparent
|
/* не определено */ |
Функции-элементы
| возвращает аргумент без изменений (public функция-элемент) |
std::identity::operator()
<tbody> </tbody> template< class T> constexpr T&& operator()( T&& t ) const noexcept; |
||
Возвращает std::forward<T>(t).
Параметры
| t | — | аргумент для возврата |
Возвращаемое значение
std::forward<T>(t).
Примечание
Тип элемент is_transparent указывает вызывающему объекту, что этот функциональный объект является прозрачным: он принимает аргументы произвольных типов и использует идеальную переадресацию, которая позволяет избежать ненужного копирования и преобразования, когда функциональный объект используется в разнородном контексте или с аргументами rvalue. В частности, шаблонные функции, такие как std::set::find и std::set::lower_bound , используют этот тип элемента в своих типах Compare.
std::identity служит проекцией по умолчанию в алгоритмах с ограничениями. Его прямое использование обычно не требуется.
Пример
#include <algorithm>
#include <functional>
#include <iostream>
#include <ranges>
#include <string>
#include <vector>
struct Pair {
int n; std::string s;
friend std::ostream& operator<< (std::ostream& os, const Pair& p) {
return os << "{ " << p.n << ", " << p.s << " }";
}
};
// Принтер диапазона, который может печатать спроецированные (изменённые)
// элементы диапазона.
template <std::ranges::input_range R,
typename Projection = std::identity> //<- Обратите внимание на проекцию
// по умолчанию
void print(std::string_view const rem, R&& r, Projection proj = {}) {
std::cout << rem << "{ ";
std::ranges::for_each(r, [](const auto& o){ std::cout << o << ' '; }, proj);
std::cout << "}\n";
}
int main()
{
const std::vector<Pair> v{ {1, "один"}, {2, "два"}, {3, "три"} };
print("Печать с использованием std::identity в качестве проекции:\n ", v);
print("Проекция Pair::n: ", v, &Pair::n);
print("Проекция Pair::s: ", v, &Pair::s);
print("Печать с использованием пользовательского замыкания в качестве проекции:\n ", v,
[](Pair const& p) { return std::to_string(p.n) + ':' + p.s; });
}
Вывод:
Печать с использованием std::identity в качестве проекции:
{ { 1, один } { 2, два } { 3, три } }
Проекция Pair::n: { 1 2 3 }
Проекция Pair::s: { один два три }
Печать с использованием пользовательского замыкания в качестве проекции:
{ 1:один 2:два 3:три }
Смотрите также
(C++20) |
возвращает аргумент тип без изменений (шаблон класса) |