close
Пространства имён
Варианты
Действия

std::identity

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Объекты функции
Функции обёртки
(C++11)
(C++11)
Применение частичных функций
(C++20)(C++23)
(C++11)
Вызов функции
(C++17)(C++23)
Объект идентичности функции
(C++20)
Обёртки ссылок
(C++11)(C++11)
Прозрачные обёртки операторов
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Отрицатели
(C++17)
Искатели
Ограниченные компараторы
Старые привязки и адаптеры
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
(до C++17*)(до C++17*)
(до C++17*)(до C++17*)

(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
 
<tbody> </tbody>
Определено в заголовочном файле <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:три }

Смотрите также

возвращает аргумент тип без изменений
(шаблон класса) [править]