std::function: typgelöschte aufrufbare Objekte
Verbergen Sie Typen hinter std::function und verstehen Sie die Small-Buffer-Optimierung.
std::function: typgelöschte aufrufbare Objekte ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Problem: Ein Typ für viele aufrufbare Objekte
Jedes Lambda besitzt einen eindeutigen Typ. Jeder Funktionszeiger ist ein anderer Typ. Wir benötigen einen Typ, der alle diese Objekte speichern kann – std::function.
Template-Parameter
std::function<Signature> übernimmt den Rückgabetyp und die Parametertypen. Es akzeptiert jedes aufrufbare Objekt mit dieser Signatur.
#include <functional>
std::function<int(int, int)> op;
op = [](int a, int b) { return a + b; };
std::cout << op(3, 4); // 7Verschiedene aufrufbare Objekte speichern
Dieselbe std::function-Variable kann ein Lambda, einen Funktionszeiger oder einen Funktor speichern – solange die Signatur übereinstimmt.
std::function<int(int)> f;
f = [](int x) { return x * 2; }; // lambda
f = ::abs; // function pointer
f = std::negate<int>{}; // functorTyplöschung
Intern verwendet std::function Type Erasure – es speichert jedes aufrufbare Objekt und verbirgt dessen tatsächlichen Typ hinter einer einheitlichen Schnittstelle. Oft wird dafür eine kleine Heap-Allokation verwendet.
Leistungskosten
Ein Aufruf über std::function beinhaltet einen indirekten Aufruf (ähnlich wie bei einer virtuellen Funktion). Er ist langsamer als ein direkter Lambda-Aufruf. Vermeiden Sie ihn in zeitkritischen Codepfaden.
Wann Sie std::function verwenden sollten
Verwenden Sie es, wenn Sie:
- Callbacks in einem Container oder als Klassenmember speichern
- ein aufrufbares Objekt aus einer Funktion zurückgeben
- ein Plugin- oder Ereignissystem entwickeln
Leere std::function
Eine standardmäßig konstruierte std::function ist leer. Ihr Aufruf löst std::bad_function_call aus.
std::function<void()> f;
if (f) f(); else std::cout << "no callback set";Zeiger auf Memberfunktionen
Binden Sie eine Memberfunktion mit std::bind oder verpacken Sie sie in ein Lambda.
struct Obj { void greet(int) {} };
Obj o;
std::function<void(int)> cb = [&](int n) { o.greet(n); };Vergleich mit Funktionszeigern
Funktionszeiger können keinen Zustand speichern. std::function kann dies – zum Preis indirekter Aufrufe.
Vergleich mit Templates
Templates mit aufrufbaren Parametern werden zur Compile-Zeit spezialisiert – sie sind am schnellsten. std::function löst zur Laufzeit auf – langsamer, aber flexibel.
template <typename F>
void run(F f) { f(); } // compile-time, no overhead
void run(std::function<void()> f) { f(); } // runtime, type erasurestd::function in C++23: std::function_ref
C++23 hat std::function_ref hinzugefügt – eine nicht besitzende Sicht auf ein aufrufbares Objekt. Wenn die Lebensdauer begrenzt ist, wird dadurch die Heap-Allokation vermieden.
Alternativen
Es gibt schlanke Alternativen: std::move_only_function (C++23), tl::function_ref, folly::Function. Wählen Sie je nach Bedarf.
Schnelltest
Was ist der wichtigste Nachteil von std::function?
Zusammenfassung
std::function<Signature> speichert jedes aufrufbare Objekt mit einer passenden Signatur. Es eignet sich für Callbacks, Plugins und Laufzeitpolymorphie über aufrufbare Objekte – zum Preis indirekter Aufrufe.
Häufig gestellte Fragen
Ist die Lektion „std::function: typgelöschte aufrufbare Objekte“ kostenlos?
Ja — der vollständige Text von „std::function: typgelöschte aufrufbare Objekte“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „std::function: typgelöschte aufrufbare Objekte“?
Verbergen Sie Typen hinter std::function und verstehen Sie die Small-Buffer-Optimierung. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „std::function: typgelöschte aufrufbare Objekte“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Funktionsobjekte und Funktoren
- Lambda-Captures: per Wert, per Referenz, mutable
- Generische Lambdas und Closures in C++14
- std::function: typgelöschte aufrufbare Objekte