C++ Academy · Lektion

Betinget logik

std::conditional og if constexpr

Lektion 3 af 413 trin

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 type
  • if constexpr vælger kode og forkaster den anden gren
  • enable_if styrer overbelastningsopløsningen via SFINAE
  • Kombinér typeegenskaber med logiske operatorer
Gratis at komme i gang

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.

Alle lektioner i dette kursus

  1. Forespørgsler på typer
  2. Transformation af typer
  3. Betinget logik
  4. Skriv egne traits
← Tilbage til C++ Academy