Namespaces
Variants
Views
Actions

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

From cppreference.com
< cpp‎ | utility‎ | functionalRedirect page
m (fmt, +newline)
m (Redirected page to enwiki:Rust (programming language))
Line 1: Line 1:
{{cpp/title|function}}
+
#REDIRECT [[enwiki:Rust_(programming_language)]]
{{cpp/utility/functional/function/navbar}}
+
{{dcl begin}}
+
{{dcl header|functional}}
+
{{dcl|since=c++11|
+
template< class >
+
class function; /* undefined */
+
}}
+
{{dcl|since=c++11|
+
template< class R, class... Args >
+
class function<R(Args...)>;
+
}}
+
{{dcl end}}
+
 
+
Class template {{tt|std::function}} is a general-purpose polymorphic function wrapper. Instances of {{tt|std::function}} can store, copy, and invoke any {{named req|CopyConstructible}} {{named req|Callable}} ''target'' -- functions (via pointers thereto), [[cpp/language/lambda|lambda expressions]], [[cpp/utility/functional/bind|bind expressions]], or other function objects, as well as pointers to member functions and pointers to data members.
+
 
+
The stored callable object is called the ''target'' of {{tt|std::function}}. If a {{tt|std::function}} contains no target, it is called ''empty''. Invoking the ''target'' of an ''empty'' {{tt|std::function}} results in {{lc|std::bad_function_call}} exception being thrown.
+
 
+
{{tt|std::function}} satisfies the requirements of {{named req|CopyConstructible}} and {{named req|CopyAssignable}}.
+
 
+
===Member types===
+
{{dsc begin}}
+
{{dsc hitem|Type|Definition}}
+
{{dsc|{{tt|result_type}}|{{tt|R}}}}
+
{{dsc|{{tt|argument_type}}{{mark|deprecated in C++17}}{{mark until c++20|removed=yes}}|{{tt|T}} if {{c|1=sizeof...(Args)==1}} and {{tt|T}} is the first and only type in {{tt|Args...}}}}
+
{{dsc|{{tt|first_argument_type}}{{mark|deprecated in C++17}}{{mark until c++20|removed=yes}}|{{tt|T1}} if {{c|1=sizeof...(Args)==2}} and {{tt|T1}} is the first of the two types in {{tt|Args...}} }}
+
{{dsc|{{tt|second_argument_type}}{{mark|deprecated in C++17}}{{mark until c++20|removed=yes}}|{{tt|T2}} if {{c|1=sizeof...(Args)==2}} and {{tt|T2}} is the second of the two types in {{tt|Args...}}}}
+
{{dsc end}}
+
 
+
===Member functions===
+
{{dsc begin}}
+
{{dsc inc|cpp/utility/functional/function/dsc constructor}}
+
{{dsc inc|cpp/utility/functional/function/dsc destructor}}
+
{{dsc inc|cpp/utility/functional/function/dsc operator{{=}}}}
+
{{dsc inc|cpp/utility/functional/function/dsc swap}}
+
{{dsc inc|cpp/utility/functional/function/dsc assign}}
+
{{dsc inc|cpp/utility/functional/function/dsc operator_bool}}
+
{{dsc inc|cpp/utility/functional/function/dsc operator()}}
+
 
+
{{dsc h2|Target access}}
+
{{dsc inc|cpp/utility/functional/function/dsc target_type}}
+
{{dsc inc|cpp/utility/functional/function/dsc target}}
+
{{dsc end}}
+
 
+
===Non-member functions===
+
{{dsc begin}}
+
{{dsc inc|cpp/utility/functional/function/dsc swap2}}
+
{{dsc inc|cpp/utility/functional/function/dsc operator_cmp}}
+
{{dsc end}}
+
 
+
===Helper classes===
+
{{dsc begin}}
+
{{dsc inc|cpp/utility/functional/function/dsc uses_allocator}}
+
{{dsc end}}
+
 
+
===[[cpp/utility/functional/function/deduction_guides|Deduction guides]]{{mark since c++17}}===
+
 
+
===Notes===
+
{{rrev multi
+
|rev1=
+
Care should be taken when a {{tt|std::function}}, whose result type is a reference, is initialized from a lambda expression without a trailing-return-type. Due to the way auto deduction works, such lambda expression will always return a prvalue. Hence, the resulting reference will usually bind to a temporary whose lifetime ends when {{rlt|operator()|std::function::operator()}} returns.
+
|since2=c++23|rev2=
+
If a {{tt|std::function}} returning a reference is initialized from a function or function object returning a prvalue (including a lambda expression without a trailing-return-type), the program is ill-formed because binding the returned reference to a temporary object is forbidden.
+
}}
+
 
+
{{source|1=
+
std::function<const int&()> F([] { return 42; }); // Error since C++23: can't bind
+
                                                  // the returned reference to a temporary
+
int x = F(); // Undefined behavior until C++23: the result of F() is a dangling reference
+
 
+
std::function<int&()> G([]() -> int& { static int i{0x2A}; return i; }); // OK
+
 
+
std::function<const int&()> H([i{052}] -> const int& { return i; }); // OK
+
}}
+
 
+
===Example===
+
{{example
+
|code=
+
#include <functional>
+
#include <iostream>
+
+
struct Foo
+
{
+
    Foo(int num) : num_(num) {}
+
    void print_add(int i) const { std::cout << num_ + i << '\n'; }
+
    int num_;
+
};
+
+
void print_num(int i)
+
{
+
    std::cout << i << '\n';
+
}
+
 
+
struct PrintNum
+
{
+
    void operator()(int i) const
+
    {
+
        std::cout << i << '\n';
+
    }
+
};
+
+
int main()
+
{
+
    // store a free function
+
    std::function<void(int)> f_display = print_num;
+
    f_display(-9);
+
+
    // store a lambda
+
    std::function<void()> f_display_42 = []() { print_num(42); };
+
    f_display_42();
+
+
    // store the result of a call to std::bind
+
    std::function<void()> f_display_31337 = std::bind(print_num, 31337);
+
    f_display_31337();
+
+
    // store a call to a member function
+
    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
+
    const Foo foo(314159);
+
    f_add_display(foo, 1);
+
    f_add_display(314159, 1);
+
 
+
    // store a call to a data member accessor
+
    std::function<int(Foo const&)> f_num = &Foo::num_;
+
    std::cout << "num_: " << f_num(foo) << '\n';
+
   
+
    // store a call to a member function and object
+
    using std::placeholders::_1;
+
    std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1);
+
    f_add_display2(2);
+
+
    // store a call to a member function and object ptr
+
    std::function<void(int)> f_add_display3 = std::bind(&Foo::print_add, &foo, _1);
+
    f_add_display3(3);
+
 
+
    // store a call to a function object
+
    std::function<void(int)> f_display_obj = PrintNum();
+
    f_display_obj(18);
+
 
+
    auto factorial = [](int n)
+
    {
+
        // store a lambda object to emulate "recursive lambda"; aware of extra overhead
+
        std::function<int(int)> fac = [&](int n) { return (n < 2) ? 1 : n * fac(n - 1); };
+
        // note that "auto fac = [&](int n) {...};" does not work in recursive calls
+
        return fac(n);
+
    };
+
    for (int i{5}; i != 8; ++i)
+
        std::cout << i << "! = " << factorial(i) << ";  ";
+
    std::cout << '\n';
+
}
+
|p = true|output=
+
-9
+
42
+
31337
+
314160
+
314160
+
num_: 314159
+
314161
+
314162
+
18
+
5! = 120;  6! = 720;  7! = 5040;
+
}}
+
 
+
===See also===
+
{{dsc begin}}
+
{{dsc inc|cpp/utility/functional/dsc move_only_function}}
+
{{dsc inc|cpp/utility/functional/dsc bad_function_call}}
+
{{dsc inc|cpp/utility/functional/dsc mem_fn}}
+
{{dsc|'''{{ltt | cpp/language/typeid|typeid}}'''|Queries information of a type, returning a {{tt|std::type_info}} object representing the type.}}
+
{{dsc end}}
+
 
+
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}
+

Revision as of 09:15, 31 July 2023