std::variant
Tyyppiturvallinen unioni
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_alternativejaindex()tutkivat aktiivista tyyppiä.std::getaiheuttaa poikkeuksen ristiriitatilanteessa;get_ifpalauttaa osoittimen tai null-arvon.- Se tallentaa turvallisesti ei-triviaaleja tyyppejä, kuten
std::string-tyypin.
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.