0Pricing
C++ Academy · Lektion

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);   // 7

Verschiedene 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>{};                  // functor

Typlö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 erasure

std::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

  1. Funktionsobjekte und Funktoren
  2. Lambda-Captures: per Wert, per Referenz, mutable
  3. Generische Lambdas und Closures in C++14
  4. std::function: typgelöschte aufrufbare Objekte
← Zurück zu C++ Academy