std::bind
Bind argumenten aan callables
std::bind is een gratis C++ Academy-les op CoddyKit. Dit is les 3 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::bind?
std::bind maakt een nieuw aanroepbaar object door enkele argumenten van een bestaand object vast te leggen. Dit heet partiële toepassing.
- Bevindt zich in
<functional>. - Retourneert een aanroepbaar object van een niet-gespecificeerd type.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
auto add10 = std::bind(add, 10, 5);
std::cout << add10() << '\n';
return 0;
}Plaatsaanduiders
Plaatsaanduiders zoals std::placeholders::_1 markeren argumenten die later worden aangeleverd wanneer het gebonden object wordt aangeroepen.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
using namespace std::placeholders;
auto add10 = std::bind(add, 10, _1);
std::cout << add10(7) << '\n';
return 0;
}Argumenten herschikken
Plaatsaanduiders kunnen in elke volgorde voorkomen, zodat je de posities van de argumenten die de aanroeper aanlevert kunt omwisselen.
#include <iostream>
#include <functional>
int sub(int a, int b) { return a - b; }
int main() {
using namespace std::placeholders;
auto flipped = std::bind(sub, _2, _1);
std::cout << flipped(3, 10) << '\n';
return 0;
}Meerdere argumenten binden
Je kunt meerdere argumenten tegelijk vastleggen en de overige als plaatsaanduiders laten staan.
#include <iostream>
#include <functional>
int volume(int l, int w, int h) { return l * w * h; }
int main() {
using namespace std::placeholders;
auto box = std::bind(volume, 2, _1, 5);
std::cout << box(3) << '\n';
return 0;
}Het resultaat opslaan
Het object dat door std::bind wordt geretourneerd, kan in een std::function worden opgeslagen voor een concreet type met een naam.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
using namespace std::placeholders;
std::function<int(int)> add100 = std::bind(add, 100, _1);
std::cout << add100(1) << '\n';
return 0;
}Lidfuncties binden
std::bind kan een lidfunctie als doel gebruiken door de lidpointer en een object (of plaatsaanduider) voor this door te geven.
#include <iostream>
#include <functional>
struct Counter {
int add(int x) { return value += x; }
int value = 0;
};
int main() {
using namespace std::placeholders;
Counter c;
auto bump = std::bind(&Counter::add, &c, _1);
std::cout << bump(5) << ' ' << bump(3) << '\n';
return 0;
}Binden op waarde versus op verwijzing
Gebonden argumenten worden standaard gekopieerd. Omwikkel een argument met std::ref om het op verwijzing te binden, zodat wijzigingen zichtbaar zijn.
#include <iostream>
#include <functional>
void addTo(int& target, int amount) { target += amount; }
int main() {
using namespace std::placeholders;
int total = 0;
auto acc = std::bind(addTo, std::ref(total), _1);
acc(5);
acc(10);
std::cout << total << '\n';
return 0;
}Gebonden aanroepbare objecten in algoritmen gebruiken
Een gebonden aanroepbaar object werkt als predicaat of bewerking in standaardalgoritmen.
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
bool greaterThan(int x, int limit) { return x > limit; }
int main() {
using namespace std::placeholders;
std::vector<int> v = {1, 5, 8, 2, 9};
auto over4 = std::bind(greaterThan, _1, 4);
std::cout << std::count_if(v.begin(), v.end(), over4) << '\n';
return 0;
}Bind nesten
Bind-expressies kunnen worden samengesteld, al worden ze daardoor snel moeilijk leesbaar. Elke plaatsaanduider verwijst nog steeds naar de argumenten van de uiteindelijke aanroeper.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int times(int a, int b) { return a * b; }
int main() {
using namespace std::placeholders;
auto f = std::bind(add, std::bind(times, 2, _1), 3);
std::cout << f(5) << '\n';
return 0;
}Extra argumenten negeren
Als de gebonden aanroep slechts enkele plaatsaanduiders gebruikt, worden extra argumenten die tijdens de aanroep worden doorgegeven gewoon genegeerd.
#include <iostream>
#include <functional>
int show(int a) { return a; }
int main() {
using namespace std::placeholders;
auto f = std::bind(show, _1);
std::cout << f(42, 99, 100) << '\n';
return 0;
}Wanneer een lambda duidelijker is
Modern C++ geeft vaak de voorkeur aan een lambda boven std::bind, omdat die leesbaarder is en de compiler haar beter kan optimaliseren.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
auto add10 = [](int x) { return add(10, x); };
std::cout << add10(5) << '\n';
return 0;
}Korte toets
Toets je begrip van plaatsaanduiders.
Samenvatting
Je hebt geleerd hoe std::bind werkt:
- het legt enkele argumenten vast en gebruikt plaatsaanduiders
_1,_2voor de overige - het kan argumenten herschikken, lidfuncties binden en
std::refgebruiken - resultaten kunnen in
std::functionworden opgeslagen en in algoritmen worden gebruikt - lambdas zijn vaak duidelijker in modern C++
Vervolgens vergelijk je lambdas, bind en functiepointers om het juiste hulpmiddel te kiezen.
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::bind” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “std::bind”, 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::bind”?
Bind argumenten aan callables 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 3 van 4.
Hoe lang duurt de les “std::bind”?
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.