Betinget logik
std::conditional og if constexpr
Betinget logik er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Valg af typer og kodeveje
Logik baseret på typeegenskaber lader kode vælge typer og kodeveje ved kompilering. De vigtigste værktøjer er std::conditional og if constexpr.
std::conditional
std::conditional_t<cond, A, B> evalueres til A, når cond er sand, og ellers til 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;
}Valg af lagertype
En almindelig anvendelse er at vælge en bred type til store værdier og en smal type ellers.
#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;
}Grundlæggende om if constexpr
if constexpr (C++17) forkaster den gren, der ikke vælges, ved kompilering. Kun den valgte gren skal kunne kompileres for den givne type.
#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;
}Hvorfor if constexpr er bedre end if ved kørselstid
Med en almindelig if skal begge grene kunne kompileres for enhver T. Med if constexpr instantieres den forkastede gren ikke, så den kan indeholde typespecifik kode, der ellers ville være ugyldig.
Typespecifikke operationer
Det er umuligt med en almindelig if, fordi .length() ikke ville kunne kompileres for int.
#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 til overbelastninger
Før if constexpr valgte std::enable_if overbelastninger via SFINAE. Den fjerner en funktion fra overbelastningsopløsningen, når en betingelse er falsk.
#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;
}Kombination af betingelser
Du kan kombinere typeegenskaber med &&, || og ! i betingelser, der evalueres ved kompilering, præcis som almindelige boolske værdier.
#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;
}Rekursivt valg ved kompilering
if constexpr muliggør rekursion ved kompilering, hvilket er nyttigt til at behandle tupler eller parameterpakker element for element.
conjunction og disjunction
C++17 har også std::conjunction og std::disjunction til kortsluttende logisk OG/ELLER over en liste af typeegenskaber.
Vælg det rette værktøj
Brug conditional til at vælge en type, if constexpr til at vælge kode og enable_if/koncepter til at styre overbelastningsopløsningen. Moderne kode foretrækker if constexpr og koncepter for at gøre koden tydelig.
Hurtigt tjek
Husk den vigtigste fordel ved if constexpr.
Opsummering
Du har lært betinget logik ved kompilering.
conditional_t<c,A,B>vælger en typeif constexprvælger kode og forkaster den anden grenenable_ifstyrer overbelastningsopløsningen via SFINAE- Kombinér typeegenskaber med logiske operatorer
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Betinget logik” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Betinget logik”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Betinget logik”?
std::conditional og if constexpr Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Betinget logik”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.