C++ Academy · Oppitunti

std::variant

Tyyppiturvallinen unioni

Oppitunti 3/413 vaihetta

std::variant on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Tyyppiturvallinen unioni

std::variant sisältää täsmälleen yhden arvon kiinteästä tyyppiluettelosta ja muistaa, mikä tyyppi on kyseessä. Ottakaa <variant> käyttöön käyttääksenne sitä.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 10;
    std::cout << std::get<int>(v) << "\n";
}

Eri tyyppien sijoittaminen

Voitte sijoittaa variantille minkä tahansa sen vaihtoehtotyypeistä uudelleen. Se päivittää aktiivisen vaihtoehdon automaattisesti.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 5;
    v = 3.14; // now holds a double
    std::cout << std::get<double>(v) << "\n";
}

Aktiivisen tyypin tarkistaminen

std::holds_alternative<T>(v) kertoo, sisältääkö variantti parhaillaan tyyppiä T.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 2.0;
    std::cout << std::holds_alternative<double>(v) << "\n";
    std::cout << std::holds_alternative<int>(v) << "\n";
}

index()-funktio

v.index() palauttaa aktiivisen tyypin nollasta alkavan sijainnin tyyppiluettelossa.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double, char> v = (char)65;
    std::cout << v.index() << "\n"; // 2
}

Turvallinen käyttö std::get-funktiolla

std::get<T> palauttaa arvon, jos T on aktiivinen; muussa tapauksessa se aiheuttaa poikkeuksen std::bad_variant_access. Hiljaisia roska-arvoja ei synny.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 7;
    try {
        std::cout << std::get<double>(v) << "\n";
    } catch (const std::bad_variant_access& e) {
        std::cout << "wrong type!\n";
    }
}

Poikkeukseton get_if

std::get_if<T>(&v) palauttaa osoittimen arvoon tai nullptr-arvon, jos T ei ole aktiivinen. Se sopii erinomaisesti haarautumattomiin tarkistuksiin.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 9;
    if (auto p = std::get_if<int>(&v))
        std::cout << "int " << *p << "\n";
}

Oletuskonstruktio

Oletuskonstruktiossa oleva variantti sisältää ensimmäisen tyyppinsä arvoalustetun version. Järjestäkää tyypit niin, että ensimmäinen niistä muodostaa järkevän oletusarvon.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v; // holds int 0
    std::cout << std::get<int>(v) << "\n";
}

Merkkijonojen tallentaminen

Toisin kuin raakamuotoiset unionit, variantti voi sisältää turvallisesti ei-triviaaleja tyyppejä, kuten std::string-tyypin; elinkaarta hallitaan puolestanne.

#include <iostream>
#include <string>
#include <variant>
int main() {
    std::variant<int, std::string> v = std::string("hello");
    std::cout << std::get<std::string>(v) << "\n";
}

Variantti paluuarvona

Funktio voi palauttaa yhden useista tyypeistä palauttamalla variantin. Kutsuja tutkii sitten varianttia selvittääkseen, mikä tyyppi palautui.

#include <iostream>
#include <string>
#include <variant>
std::variant<int, std::string> parse(bool ok) {
    if (ok) return 42;
    return std::string("error");
}
int main() {
    auto r = parse(false);
    if (auto s = std::get_if<std::string>(&r)) std::cout << *s << "\n";
}

emplace paikalla vaihtamiseen

v.emplace<T>(args...) muodostaa uuden T-tyyppisen arvon suoraan variantin sisään ja vaihtaa aktiivisen vaihtoehdon.

#include <iostream>
#include <string>
#include <variant>
int main() {
    std::variant<int, std::string> v = 1;
    v.emplace<std::string>("switched");
    std::cout << std::get<std::string>(v) << "\n";
}

Miksi varianttia kannattaa suosia

std::variant tarjoaa unionin tehokkaan muistinkäytön ja täyden tyyppiturvallisuuden: se seuraa aktiivista tyyppiä, hallitsee elinkaaret ja estää väärän tyyppisen käytön. Seuraava oppitunti näyttää siisteimmän tavan käsitellä sitä.

Pikatarkistus

Tarkistakaa, miten hyvin ymmärrätte std::variant-tyypin.

Kertaus

Opitte std::variant-tyypin perusteet:

  • Se sisältää yhden useista tyypeistä ja seuraa, mikä tyyppi on aktiivinen.
  • holds_alternative ja index() tutkivat aktiivista tyyppiä.
  • std::get aiheuttaa poikkeuksen ristiriitatilanteessa; get_if palauttaa osoittimen tai null-arvon.
  • Se tallentaa turvallisesti ei-triviaaleja tyyppejä, kuten std::string-tyypin.
Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”std::variant” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “std::variant”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”std::variant”?

Tyyppiturvallinen unioni Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”std::variant”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Rajattu enum class
  2. Unionit ja niiden riskit
  3. std::variant
  4. std::visit
← Takaisin: C++ Academy