std::function
Sla elke callable op
std::function is een gratis C++ Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C++ Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C++ Academy bevat in totaal 4 lessen.
Wat is std::function?
std::function is een wrapper met uitgewist type die elk aanroepbaar object kan bevatten dat overeenkomt met een bepaalde signatuur: vrije functies, lambdas, functors of gebonden expressies.
- Wordt gedeclareerd met de doelsignatuur.
- Bevindt zich in
<functional>.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
std::function<int(int, int)> f = add;
std::cout << f(2, 3) << '\n';
return 0;
}Een lambda opslaan
In tegenstelling tot een gewone functiepointer slaat std::function zonder problemen een lambda op, zelfs een lambda met vastleggingen.
#include <iostream>
#include <functional>
int main() {
int offset = 10;
std::function<int(int)> f = [offset](int x) { return x + offset; };
std::cout << f(5) << '\n';
return 0;
}Een functor opslaan
Een functor is een object met operator(). std::function kan zo'n object omwikkelen en zijn operator aanroepen wanneer het wordt aangeroepen.
#include <iostream>
#include <functional>
struct Multiplier {
int factor;
int operator()(int x) const { return x * factor; }
};
int main() {
std::function<int(int)> f = Multiplier{3};
std::cout << f(4) << '\n';
return 0;
}Het doel opnieuw toewijzen
Eén std::function-variabele kan tijdens zijn levensduur naar verschillende aanroepbare objecten verwijzen. Dat is handig om gedrag tijdens uitvoering om te wisselen.
#include <iostream>
#include <functional>
int main() {
std::function<int(int)> f = [](int x) { return x + 1; };
std::cout << f(10) << '\n';
f = [](int x) { return x * x; };
std::cout << f(10) << '\n';
return 0;
}Lege std::function
Een standaard geconstrueerde std::function bevat niets. Als je die aanroept, werpt ze std::bad_function_call, dus toets eerst of ze leeg is.
#include <iostream>
#include <functional>
int main() {
std::function<void()> f;
if (f) {
f();
} else {
std::cout << "empty\n";
}
return 0;
}Als parameter
Functies kunnen een std::function-parameter accepteren om elk overeenkomend aanroepbaar object toe te laten, waardoor API's flexibel worden.
#include <iostream>
#include <functional>
void repeat(int n, const std::function<void(int)>& action) {
for (int i = 0; i < n; ++i) action(i);
}
int main() {
repeat(3, [](int i) { std::cout << "step " << i << '\n'; });
return 0;
}Callbacks opslaan
Een veelvoorkomende toepassing is een callback in een klasselid bewaren, zodat die later kan worden aangeroepen wanneer er een gebeurtenis plaatsvindt.
#include <iostream>
#include <functional>
struct Button {
std::function<void()> onClick;
void click() { if (onClick) onClick(); }
};
int main() {
Button b;
b.onClick = [] { std::cout << "clicked!\n"; };
b.click();
return 0;
}Een vector met aanroepbare objecten
Omdat ze hetzelfde type hebben, kunnen verschillende aanroepbare objecten samen in een container staan en na elkaar worden aangeroepen.
#include <iostream>
#include <functional>
#include <vector>
int inc(int x) { return x + 1; }
int main() {
std::vector<std::function<int(int)>> ops;
ops.push_back(inc);
ops.push_back([](int x) { return x * 2; });
for (auto& op : ops) std::cout << op(10) << ' ';
std::cout << '\n';
return 0;
}De kosten van type-uitwissing
std::function kan geheugen toewijzen en voegt een indirecte aanroep toe. Daardoor is het iets trager dan een directe aanroep of een aanroepbaar object op basis van een template. Gebruik het wanneer je uniforme opslag nodig hebt.
#include <iostream>
#include <functional>
int main() {
std::function<int()> f = [] { return 42; };
int total = 0;
for (int i = 0; i < 5; ++i) total += f();
std::cout << total << '\n';
return 0;
}Een std::function retourneren
Een factory kan een geconfigureerd aanroepbaar object bouwen en retourneren, zodat aanroepers aangepast gedrag kunnen verkrijgen.
#include <iostream>
#include <functional>
std::function<int(int)> adder(int n) {
return [n](int x) { return x + n; };
}
int main() {
auto add5 = adder(5);
std::cout << add5(10) << '\n';
return 0;
}Vergelijken met functiepointers
std::function is flexibeler dan een functiepointer omdat het status kan opslaan, maar die flexibiliteit kost een beetje snelheid en mogelijk een geheugenallocatie.
#include <iostream>
#include <functional>
int main() {
int base = 7;
std::function<int(int)> stateful = [base](int x) { return x + base; };
std::cout << "Stateful result: " << stateful(3) << '\n';
return 0;
}Korte toets
Toets je begrip van std::function.
Samenvatting
Je hebt geleerd dat std::function:
- elk aanroepbaar object omwikkelt dat overeenkomt met zijn signatuur, waaronder lambdas en functors met status
- opnieuw kan worden toegewezen, in containers kan worden opgeslagen en door factories kan worden geretourneerd
bad_function_callwerpt wanneer het leeg is- een beetje extra kosten door type-uitwissing met zich meebrengt
Vervolgens gebruik je std::bind om argumenten van aanroepbare objecten vooraf in te vullen.
Leer C++ met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 51
- Lessen
- 203
Veelgestelde vragen
Is de les “std::function” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “std::function”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus C++ Academy bevat in totaal 4 lessen.
Wat leer ik in “std::function”?
Sla elke callable op Je oefent met C++ Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C++ Academy te beginnen?
Ervaring vooraf is niet nodig. C++ Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “std::function”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C++ Academy?
Ja. Elke les over C++ Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Functieaanwijzers
- std::function
- std::bind
- Callables kiezen