|
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Old binders and adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Member functions | ||||
(until C++17) | ||||
Non-member functions | ||||
(until C++20) | ||||
Helper classes | ||||
(until C++17) | ||||
Deduction guides(C++17) |
Defined in header <functional> | ||
template<class> class function;/* undefined */ | (since C++11) | |
template<class R,class...Args> class function<R(Args...)>; | (since C++11) | |
Class templatestd::function
is a general-purpose polymorphic function wrapper. Instances ofstd::function
can store, copy, and invoke anyCopyConstructibleCallabletarget -- functions (via pointers thereto),lambda expressions,bind expressions, or other function objects, as well as pointers to member functions and pointers to data members.
The stored callable object is called thetarget ofstd::function
. If astd::function
contains no target, it is calledempty. Invoking thetarget of anemptystd::function
results instd::bad_function_call exception being thrown.
std::function
satisfies the requirements ofCopyConstructible andCopyAssignable.
Contents |
Type | Definition |
result_type | R |
argument_type (deprecated in C++17)(removed in C++20) | T ifsizeof...(Args)==1 andT is the first and only type inArgs... |
first_argument_type (deprecated in C++17)(removed in C++20) | T1 ifsizeof...(Args)==2 andT1 is the first of the two types inArgs... |
second_argument_type (deprecated in C++17)(removed in C++20) | T2 ifsizeof...(Args)==2 andT2 is the second of the two types inArgs... |
constructs a newstd::function instance(public member function)[edit] | |
destroys astd::function instance(public member function)[edit] | |
assigns a new target (public member function)[edit] | |
swaps the contents (public member function)[edit] | |
(removed in C++17) | assigns a new target (public member function)[edit] |
checks if a target is contained (public member function)[edit] | |
invokes the target (public member function)[edit] | |
Target access | |
obtains thetypeid of the stored target (public member function)[edit] | |
obtains a pointer to the stored target (public member function)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(removed in C++20) | compares astd::function withnullptr (function template)[edit] |
(C++11)(until C++17) | specializes thestd::uses_allocator type trait (class template specialization)[edit] |
Care should be taken when a | (until C++23) |
If a | (since C++23) |
std::function<constint&()> F([]{return42;});// Error since C++23: can't bind// the returned reference to a temporaryint x= F();// Undefined behavior until C++23: the result of F() is a dangling reference std::function<int&()> G([]()->int&{staticint i{0x2A};return i;});// OK std::function<constint&()> H([i{052}]->constint&{return i;});// OK
#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(Fooconst&)> f_num=&Foo::num_;std::cout<<"num_: "<< f_num(foo)<<'\n'; // store a call to a member function and objectusing 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 callsreturn fac(n);};for(int i{5}; i!=8;++i)std::cout<< i<<"! = "<< factorial(i)<<"; ";std::cout<<'\n';}
Possible output:
-94231337314160314160num_: 314159314161314162185! = 120; 6! = 720; 7! = 5040;
(C++23) | move-only wrapper of any callable object that supports qualifiers in a given call signature (class template)[edit] |
(C++26) | copyable wrapper of any copy constructible callable object that supports qualifiers in a given call signature (class template)[edit] |
(C++26) | non-owning wrapper of any callable object (class template)[edit] |
(C++11) | the exception thrown when invoking an emptystd::function (class)[edit] |
(C++11) | creates a function object out of a pointer to a member (function template)[edit] |
typeid | queries information of a type, returning astd::type_info object representing the type |