C++ Academy · Oppitunti

Ehdollinen logiikka

std::conditional ja if constexpr

Oppitunti 3/413 vaihetta

Ehdollinen logiikka 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.

Tyyppien ja haarojen valinta

Tyyppipiirteisiin perustuvan logiikan avulla koodi voi valita tyyppejä ja suorituspolkuja käännösaikana. Keskeiset työkalut ovat std::conditional ja if constexpr.

std::conditional

std::conditional_t<cond, A, B> arvioituu tyypiksi A, kun cond on tosi, ja muuten tyypiksi B.

#include <iostream>
#include <type_traits>

int main() {
    using T = std::conditional_t<true, int, double>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

Tallennustyypin valitseminen

Yleinen käyttötapaus on valita suurille arvoille leveä tyyppi ja muussa tapauksessa kapeampi tyyppi.

#include <iostream>
#include <type_traits>

template <bool Big>
struct Storage {
    using type = std::conditional_t<Big, long long, short>;
};

int main() {
    Storage<true>::type a = 10;
    std::cout << sizeof(a) << "\n";
    return 0;
}

if constexpr -perusteet

if constexpr (C++17) hylkää valitsematta jäävän haaran käännösaikana. Vain valitun haaran on käännyttävä kyseiselle tyypille.

#include <iostream>
#include <type_traits>

template <typename T>
void describe(T v) {
    if constexpr (std::is_integral_v<T>)
        std::cout << "integer: " << v << "\n";
    else
        std::cout << "other: " << v << "\n";
}

int main() {
    describe(5);
    describe(2.5);
    return 0;
}

Miksi if constexpr on parempi kuin ajonaikainen if

Tavallisen if-lauseen molempien haarojen on käännyttävä jokaiselle T-tyypille. if constexpr -lauseessa hylättyä haaraa ei instansioida, joten se voi sisältää tyyppikohtaista koodia, joka olisi muuten virheellistä.

Tyyppikohtaiset operaatiot

Tätä ei voi tehdä tavallisella if-lauseella, koska .length() ei kääntyisi int-tyypille.

#include <iostream>
#include <string>
#include <type_traits>

template <typename T>
auto size_of(const T& v) {
    if constexpr (std::is_same_v<T, std::string>)
        return v.length();
    else
        return sizeof(v);
}

int main() {
    std::cout << size_of(std::string("hi")) << "\n";
    std::cout << size_of(42) << "\n";
    return 0;
}

enable_if ylikuormituksia varten

Ennen if constexpr -lausetta std::enable_if valitsi ylikuormitukset SFINAE-menetelmällä. Se poistaa funktion ylikuormituksen ratkaisusta, kun ehto on epätosi.

#include <iostream>
#include <type_traits>

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void only_int(T v) { std::cout << "int " << v << "\n"; }

int main() {
    only_int(7);
    return 0;
}

Ehtojen yhdistäminen

Voitte yhdistää tyyppipiirteitä käännösaikaisissa ehdoissa operaattoreilla &&, || ja ! aivan kuten tavallisia totuusarvoja.

#include <iostream>
#include <type_traits>

template <typename T>
void check() {
    if constexpr (std::is_integral_v<T> && !std::is_same_v<T, bool>)
        std::cout << "non-bool integer\n";
    else
        std::cout << "something else\n";
}

int main() {
    check<int>();
    check<bool>();
    return 0;
}

Rekursiivinen käännösaikainen valinta

if constexpr mahdollistaa käännösaikaisen rekursion, josta on hyötyä tuplejen tai parametripakettien käsittelyssä alkio kerrallaan.

conjunction ja disjunction

C++17 tarjoaa myös std::conjunction- ja std::disjunction-mallit loogisen AND- tai OR-operaation suorittamiseen lyhytkestoisesti tyyppipiirteiden luettelolle.

Oikean työkalun valinta

Käyttäkää conditional-mallia tyypin valitsemiseen, if constexpr -lausetta koodin valitsemiseen ja enable_if-mallia tai konsepteja ylikuormituksen ratkaisun ohjaamiseen. Nykyaikaisessa koodissa suositaan selkeyden vuoksi if constexpr -lausetta ja konsepteja.

Pikatarkistus

Palauttakaa mieleenne if constexpr -lauseen tärkein hyöty.

Kertaus

Opitte käännösaikaisen ehdollisen logiikan.

  • conditional_t<c,A,B> valitsee tyypin
  • if constexpr valitsee koodin ja hylkää toisen haaran
  • enable_if ohjaa ylikuormituksen ratkaisua SFINAE-menetelmällä
  • Yhdistäkää tyyppipiirteitä loogisilla operaattoreilla
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 ”Ehdollinen logiikka” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Ehdollinen logiikka”. 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 ”Ehdollinen logiikka”?

std::conditional ja if constexpr 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 ”Ehdollinen logiikka”-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. Tyyppien tutkiminen
  2. Tyyppien muuntaminen
  3. Ehdollinen logiikka
  4. Mukautettujen traitien kirjoittaminen
← Takaisin: C++ Academy