Ehdollinen logiikka
std::conditional ja if constexpr
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 tyypinif constexprvalitsee koodin ja hylkää toisen haaranenable_ifohjaa ylikuormituksen ratkaisua SFINAE-menetelmällä- Yhdistäkää tyyppipiirteitä loogisilla operaattoreilla
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
- Tyyppien tutkiminen
- Tyyppien muuntaminen
- Ehdollinen logiikka
- Mukautettujen traitien kirjoittaminen