std::visit
Verwerk variantalternatieven
std::visit is een gratis C++ Academy-les op CoddyKit. Dit is les 4 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.
Waarom std::visit?
Elk alternatief handmatig controleren met get_if wordt al snel omslachtig. std::visit past een aanroepbaar object toe op het type dat de variant momenteel bevat en handelt het doorsturen voor je af.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> v = 4;
std::visit([](auto x){ std::cout << x << "\n"; }, v);
}Een generieke lambda als bezoeker
Een lambda die auto gebruikt, werkt voor elk alternatief als de inhoud voor al die alternatieven compileert. Hier drukken we het actieve type af.
#include <iostream>
#include <string>
#include <variant>
int main() {
std::variant<int, std::string> v = std::string("hi");
std::visit([](const auto& x){ std::cout << x << "\n"; }, v);
}Een waarde retourneren
std::visit kan een waarde retourneren. Elke vertakking moet hetzelfde type retourneren.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> v = 2.5;
double d = std::visit([](auto x){ return x * 2.0; }, v);
std::cout << d << "\n";
}Gedrag per type met if constexpr
Als je binnen één generieke lambda per type anders wilt handelen, combineer je if constexpr met std::decay_t en std::is_same_v.
#include <iostream>
#include <string>
#include <variant>
#include <type_traits>
int main() {
std::variant<int, std::string> v = 5;
std::visit([](const auto& x){
using T = std::decay_t<decltype(x)>;
if constexpr (std::is_same_v<T, int>) std::cout << "int " << x << "\n";
else std::cout << "str " << x << "\n";
}, v);
}Een bezoeker als struct
Je kunt ook een struct schrijven met meerdere overbelastingen van operator(), één per type. De compiler kiest de overeenkomende overbelasting.
#include <iostream>
#include <string>
#include <variant>
struct Printer {
void operator()(int i) const { std::cout << "int " << i << "\n"; }
void operator()(const std::string& s) const { std::cout << "str " << s << "\n"; }
};
int main() {
std::variant<int, std::string> v = std::string("yo");
std::visit(Printer{}, v);
}Het patroon met overbelastingen
Een populaire hulpfunctie combineert meerdere lambda's tot één bezoeker. Elke lambda verwerkt een specifiek type.
#include <iostream>
#include <string>
#include <variant>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
std::variant<int, std::string> v = 8;
std::visit(overloaded{
[](int i){ std::cout << "i=" << i << "\n"; },
[](const std::string& s){ std::cout << "s=" << s << "\n"; }
}, v);
}Volledigheid
Een bezoeker moet elk alternatief verwerken, anders compileert de code niet. Deze controle tijdens het compileren voorkomt dat je een geval vergeet.
Bezoeken en wijzigen
Als je de variant doorgeeft als een niet-constreferentie, kan de bezoeker de opgeslagen waarde rechtstreeks wijzigen.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> v = 10;
std::visit([](auto& x){ x += 1; }, v);
std::cout << std::get<int>(v) << "\n";
}Meerdere varianten
std::visit kan meerdere varianten tegelijk ontvangen; de bezoeker krijgt dan één argument per variant.
#include <iostream>
#include <variant>
int main() {
std::variant<int, double> a = 2;
std::variant<int, double> b = 3.0;
auto sum = std::visit([](auto x, auto y){ return x + y; }, a, b);
std::cout << sum << "\n";
}Een stijl voor bezoekers kiezen
Gebruik een generieke auto-lambda voor uniforme verwerking, het patroon met overbelastingen voor duidelijke logica per type en een struct als bezoeker wanneer je het gedrag op meerdere aanroeppunten wilt hergebruiken.
Bezoeken versus get_if
get_if is prima voor één snelle controle, maar std::visit schaalt beter: het dwingt volledigheid af en houdt alle logica per type op één plek.
Korte controle
Controleer of je std::visit goed begrijpt.
Samenvatting
Je hebt std::visit geleerd:
- Stuurt een aanroepbaar object door naar het actieve alternatief.
- Gebruik generieke lambda's,
if constexpr, structbezoekers of het patroon met overbelastingen. - Bezoekers moeten volledig zijn (controle tijdens het compileren).
- Kunnen waarden retourneren en meerdere varianten tegelijk bezoeken.
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::visit” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “std::visit”, 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::visit”?
Verwerk variantalternatieven 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 4 van 4.
Hoe lang duurt de les “std::visit”?
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.