C++ Academy · Les

std::function

Sla elke callable op

Les 2 van 413 stappen

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_call werpt 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.

Gratis beginnen

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

  1. Functieaanwijzers
  2. std::function
  3. std::bind
  4. Callables kiezen
← Terug naar C++ Academy