Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/utility/functional/identity"

From cppreference.com
< cpp‎ | utility‎ | functional
(Wording update.)
m (~)
 
(2 intermediate revisions by one user not shown)
Line 7: Line 7:
 
{{tt|std::identity}} is a function object type whose {{c|operator()}} returns its argument unchanged.
 
{{tt|std::identity}} is a function object type whose {{c|operator()}} returns its argument unchanged.
  
===Nested types===
+
===Member types===
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc hitem|Nested type|Definition}}
+
{{dsc hitem|Type|Definition}}
 
{{dsc|{{tt|is_transparent}}|[[cpp/utility/functional#Transparent function objects|unspecified]]}}
 
{{dsc|{{tt|is_transparent}}|[[cpp/utility/functional#Transparent function objects|unspecified]]}}
 
{{dsc end}}
 
{{dsc end}}
Line 45: Line 45:
 
#include <ranges>
 
#include <ranges>
 
#include <string>
 
#include <string>
#include <vector>
 
  
 
struct Pair
 
struct Pair
Line 53: Line 52:
 
     friend std::ostream& operator<<(std::ostream& os, const Pair& p)
 
     friend std::ostream& operator<<(std::ostream& os, const Pair& p)
 
     {
 
     {
         return os << "{ " << p.n << ", " << p.s << " }";
+
         return os << '{' << p.n << ", " << p.s << '}';
 
     }
 
     }
 
};
 
};
Line 60: Line 59:
 
template<std::ranges::input_range R,
 
template<std::ranges::input_range R,
 
         typename Projection = std::identity> //<- Notice the default projection
 
         typename Projection = std::identity> //<- Notice the default projection
void print(std::string_view const rem, R&& r, Projection proj = {})
+
void print(std::string_view const rem, R&& range, Projection projection = {})
 
{
 
{
     std::cout << rem << "{ ";
+
     std::cout << rem << '{';
     std::ranges::for_each(r, [](const auto& o) { std::cout << o << ' '; }, proj);
+
     std::ranges::for_each(
 +
        range,
 +
        [O = 0](const auto& o) mutable { std::cout << (O++ ? ", " : "") << o; },
 +
        projection
 +
    );
 
     std::cout << "}\n";
 
     std::cout << "}\n";
 
}
 
}
Line 69: Line 72:
 
int main()
 
int main()
 
{
 
{
     const std::vector<Pair> v{{1, "one"}, {2, "two"}, {3, "three"}};
+
     const auto v = {Pair{1, "one"}, {2, "two"}, {3, "three"}<!---->};
 
      
 
      
 
     print("Print using std::identity as a projection: ", v);
 
     print("Print using std::identity as a projection: ", v);
Line 78: Line 81:
 
}
 
}
 
|output=
 
|output=
Print using std::identity as a projection: { { 1, one } { 2, two } { 3, three } }
+
Print using std::identity as a projection: {<!---->{1, one}, {2, two}, {3, three}<!---->}
Project the Pair::n: { 1 2 3 }
+
Project the Pair::n: {1, 2, 3}
Project the Pair::s: { one two three }
+
Project the Pair::s: {one, two, three}
Print using custom closure as a projection: { 1:one 2:two 3:three }
+
Print using custom closure as a projection: {1:one, 2:two, 3:three}
 
}}
 
}}
  

Latest revision as of 20:39, 13 July 2024

 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
 
Function objects
Function invocation
(C++17)(C++23)
Identity function object
identity
(C++20)
Transparent operator wrappers
(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)

Old binders and adaptors
(until C++17*)
(until C++17*)
(until C++17*)
(until C++17*)  
(until C++17*)
(until C++17*)(until C++17*)(until C++17*)(until C++17*)
(until C++20*)
(until C++20*)
(until C++17*)(until C++17*)
(until C++17*)(until C++17*)

(until C++17*)
(until C++17*)(until C++17*)(until C++17*)(until C++17*)
(until C++20*)
(until C++20*)
 
Defined in header <functional>
struct identity;
(since C++20)

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

Contents

[edit] Member types

Type Definition
is_transparent unspecified

[edit] Member functions

operator()
returns the argument unchanged
(public member function)

std::identity::operator()

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

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

Parameters

t - argument to return

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 <algorithm>
#include <functional>
#include <iostream>
#include <ranges>
#include <string>
 
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

returns the type argument unchanged
(class template) [edit]