std::identity - cppreference.com (original) (raw)

| | | | | ---------------- | | ------------- | | struct identity; | | (since C++20) |

std::identity is a function object type whose operator() returns its argument unchanged.

Contents

[edit] Member types

[edit] Member functions

| | returns the argument unchanged (public member function) | | ---------------------------------------------------------- |

std:🆔:operator()

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

Returns std::forward<T>(t).

Parameters

Return value

std::forward<T>(t).

[edit] Notes

std::identity serves as the default projection in constrained algorithms. Its direct usage is usually not needed.

[edit] Example

#include #include #include #include #include   struct Pair { int n; std::string s; friend std::ostream& operator<<(std::ostream& os, const Pair& p) { return os << '{' << p.n << ", " << p.s << '}'; } };   // A range-printer that can print projected (modified) elements of a range. template<std::ranges::input_range R, typename Projection = std::identity> //<- Notice the default projection void print(std::string_view const rem, R&& range, Projection projection = {}) { std::cout << rem << '{'; std::ranges::for_each( range, [O = 0](const auto& o) mutable { std::cout << (O++ ? ", " : "") << o; }, projection ); std::cout << "}\n"; }   int main() { const auto v = {Pair{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; }); }

Output:

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}

[edit] See also