# std::identity

< cpp‎ | utility‎ | functional

定义于头文件 `<functional>` |  |
struct identity; |  | (C++20 起)

`std::identity` 是函数对象类型，其 operator() 返回其不更改的参数。

### 成员类型

成员类型 | 定义
`is_transparent` | /* 未指定 */

### 成员函数

operator() | 返回不更改的参数 (公开成员函数)

## std::identity::operator()

template< class T> constexpr T&& operator()( T&& t ) const noexcept; |  |

返回 std::forward<T>(t) 。

### 参数

t | - | 要返回的参数

### 返回值

std::forward<T>(t) 。

### 注解

成员类型 `is_transparent` 指示调用方，此函数对象是一个通透函数对象：它接受任意类型的参数并使用完美转发，这在将函数对象在多种语境中，或以右值参数使用时，避免不需要的复制和转换。特别是，诸如 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, "one"}, {2, "two"}, {3, "three"} };

        print("Print using std::identity as a projection: ", v);
        print("Project the Pair::n: ", v, &Pair::n);
        print("Project the Pair::s: ", v, &Pair::s);
        print("Print using custom closure as a projection: ", v,
            [](Pair const& p) { return std::to_string(p.n) + ':' + p.s; });
    }

输出：

    Print using std::identity as a projection: { { 1, one } { 2, two } { 3, three } }
    Project the Pair::n: { 1 2 3 }
    Project the Pair::s: { one two three }
    Print using custom closure as a projection: { 1:one 2:two 3:three }

### 参阅

type_identity (C++20) | 返回不更改的类型实参 (类模板)