C++ Academy · leksjon

std::visit

Behandle variantalternativer

Leksjon 4 av 413 trinn

std::visit er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hvorfor std::visit?

Det blir omstendelig å kontrollere hvert alternativ manuelt med get_if. std::visit bruker en kallbar funksjon på den typen varianten inneholder for øyeblikket og håndterer valg av riktig funksjon for Dem.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 4;
    std::visit([](auto x){ std::cout << x << "\n"; }, v);
}

En generisk lambda-visitor

En lambda som tar imot auto, fungerer for alle alternativer hvis kroppen kan kompileres for dem alle. Her skriver vi ut typen som er aktiv.

#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);
}

Returnere en verdi

std::visit kan returnere en verdi. Alle grenene må returnere samme type.

#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";
}

Typeavhengig oppførsel med if constexpr

For å utføre ulik behandling per type i én generisk lambda kombineres if constexpr med std::decay_t og 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);
}

En struct-visitor

Det er også mulig å skrive en struct med flere overlagringer av operator(), én per type. Kompilatoren velger den samsvarende overlagringen.

#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);
}

Det overlagrede idiomet

En populær hjelpefunksjon kombinerer flere lambdaer til én visitor. Hver lambda håndterer en bestemt 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);
}

Uttømmende behandling

En visitor må håndtere alle alternativer, ellers vil koden ikke kompilere. Denne kontrollen ved kompileringstid forhindrer at et tilfelle glemmes.

Besøke og endre

Hvis varianten sendes inn som en referanse som ikke er const, kan visitoren endre den lagrede verdien direkte.

#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";
}

Flere varianter

std::visit kan ta imot flere varianter samtidig; visitors får da ett 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";
}

Velge visitor-stil

Bruk en generisk auto-lambda for ensartet behandling, det overlagrede idiomet for ryddig typespesifikk logikk, og en struct-visitor når oppførselen skal gjenbrukes på tvers av kallesteder.

visit kontra get_if

get_if fungerer fint for én rask kontroll, men std::visit skalerer bedre: Den krever uttømmende behandling og samler all typespesifikk logikk på ett sted.

Kort kontroll

Kontroller forståelsen av std::visit.

Oppsummering

De har lært om std::visit:

  • Sender en kallbar funksjon til det aktive alternativet.
  • Bruk generiske lambdaer, if constexpr, struct-visitorer eller det overlagrede idiomet.
  • Visitorer må være uttømmende (kontroll ved kompileringstid).
  • Kan returnere verdier og besøke flere varianter samtidig.
Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «std::visit» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «std::visit», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «std::visit»?

Behandle variantalternativer Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C++ Academy?

Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «std::visit»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?

Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. enum class med scope
  2. Unioner og risikoene deres
  3. std::variant
  4. std::visit
← Tilbake til C++ Academy