std::function
| Definiert in der Header-Datei <functional> |
||
| template< class > class function; /* undefined */ |
(seit C++11) | |
| template< class R, class... Args > class function<R(Args...)>; |
(seit C++11) | |
Die Klassen-Template std::function ist ein allgemeiner polymorpher Funktions-Wrapper. Instanzen von std::function können jeden CopyConstructible und Callable Ziel speichern, kopieren und aufrufen -- Funktionen (über Zeiger darauf), Lambda-Ausdrücke, Bind-Ausdrücke oder andere Funktions-Objekte, sowie Zeiger auf Memberfunktionen und Zeiger auf Datenmember.
Das gespeicherte aufrufbare Objekt wird als Ziel von std::function bezeichnet. Wenn ein std::function kein Ziel enthält, wird es als leer bezeichnet. Der Aufruf des Ziels eines leeren std::function führt zum Auslösen einer std::bad_function_call Ausnahme.
std::function erfüllt die Anforderungen von CopyConstructible und CopyAssignable.
Inhalt |
[edit] Member types
| Typ | Definition |
result_type
|
R
|
argument_type(deprecated in C++17)(removed in C++20) |
T, falls sizeof...(Args)==1 und T der erste und einzige Typ in Args... ist |
first_argument_type(deprecated in C++17)(removed in C++20) |
T1, falls sizeof...(Args)==2 und T1 der erste der beiden Typen in Args... ist |
second_argument_type(deprecated in C++17)(removed in C++20) |
T2, falls sizeof...(Args)==2 und T2 der zweite der beiden Typen in Args... ist |
[edit] Member functions
konstruiert eine neue std::function Instanz(public member function) | |
zerstört eine std::function Instanz(public member function) | |
| weist ein neues Ziel zu (public member function) | |
| tauscht die Inhalte (public member function) | |
| (removed in C++17) |
weist ein neues Ziel zu (public member function) |
| prüft, ob ein Ziel enthalten ist (public member function) | |
| ruft das Ziel auf (public member function) | |
Zielzugriff | |
| gibt den typeid des gespeicherten Ziels zurück (public member function) | |
| gibt einen Zeiger auf das gespeicherte Ziel zurück (public member function) | |
[edit] Non-member functions
| (C++11) |
spezialisiert den Algorithmus std::swap (function template) |
| (in C++20 entfernt) |
vergleicht ein std::function mit nullptr (function template) |
[edit] Helper classes
| (C++11) (bis C++17) |
spezialisiert das std::uses_allocator Typ-Trait (class template specialization) |
[edit] Deduction guides(seit C++17)
[edit] Notes
|
Vorsicht ist geboten, wenn ein |
(bis C++23) |
|
Wenn ein |
(seit C++23) |
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
[edit] Example
#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'; }
Mögliche Ausgabe
-9 42 31337 314160 314160 num_: 314159 314161 314162 18 5! = 120; 6! = 720; 7! = 5040;
[edit] See also
| (C++23) |
Move-only-Wrapper für jedes aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt (Klassen-Template) |
| (C++26) |
kopierfähiger Wrapper für jedes kopierkonstruierbare aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt (Klassen-Template) |
| (C++26) |
nicht-besitzender Wrapper für jedes aufrufbare Objekt (Klassen-Template) |
| (C++11) |
die Ausnahme, die beim Aufrufen eines leeren std::function ausgelöst wird (Klasse) |
| (C++11) |
erstellt ein Funktions-Objekt aus einem Zeiger auf ein Member (Funktions-Template) |
| typeid | fragt Informationen über einen Typ ab und gibt ein std::type_info-Objekt zurück, das den Typ repräsentiert |