0Pricing
C++ Academy · Lektion

Bedingte Logik

std::conditional und if constexpr

Bedingte Logik ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Typen und Verzweigungen auswählen

Die Logik von Type Traits ermöglicht es Code, zur Compile-Zeit Typen und Codepfade auszuwählen. Die wichtigsten Werkzeuge sind std::conditional und if constexpr.

std::conditional

std::conditional_t<cond, A, B> ergibt A, wenn cond true ist, andernfalls 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;
}

Einen Speichertyp auswählen

Eine häufige Anwendung: Wählen Sie für große Werte einen größeren Typ und andernfalls einen kleineren.

#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;
}

Grundlagen von if constexpr

if constexpr (C++17) verwirft den nicht ausgewählten Zweig bereits zur Kompilierzeit. Nur der ausgewählte Zweig muss für den jeweiligen Typ kompilierbar sein.

#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;
}

Warum if constexpr besser ist als ein Laufzeit-if

Bei einem regulären if müssen beide Zweige für jedes T kompilierbar sein. Bei if constexpr wird der verworfene Zweig nicht instanziiert, sodass er typspezifischen Code enthalten darf, der ansonsten ungültig wäre.

Typspezifische Operationen

Mit einem einfachen if ist dies nicht möglich, da .length() für int nicht kompilierbar wäre.

#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 für Überladungen

Vor if constexpr wählte std::enable_if Überladungen über SFINAE aus. Bei einer falschen Bedingung entfernt es eine Funktion aus der Überladungsauflösung.

#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;
}

Bedingungen kombinieren

Sie können Traits in Bedingungen zur Kompilierzeit mit &&, || und ! kombinieren – genau wie gewöhnliche boolesche Werte.

#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;
}

Rekursive Auswahl zur Kompilierzeit

if constexpr ermöglicht Rekursion zur Kompilierzeit, die sich beispielsweise zum Verarbeiten von Tupeln oder Parameter-Packs Element für Element eignet.

conjunction und disjunction

C++17 stellt außerdem std::conjunction und std::disjunction für ein kurzschlussfähiges logisches AND/OR über eine Liste von Traits bereit.

Das richtige Werkzeug auswählen

Verwenden Sie conditional, um einen Typ auszuwählen, if constexpr, um Code auszuwählen, und enable_if/Konzepte, um die Überladungsauflösung zu steuern. Moderner Code bevorzugt if constexpr und Konzepte, da sie verständlicher sind.

Kurze Überprüfung

Rufen Sie sich den wichtigsten Vorteil von if constexpr in Erinnerung.

Zusammenfassung

Sie haben bedingte Logik zur Kompilierzeit kennengelernt.

  • conditional_t<c,A,B> wählt einen Typ aus
  • if constexpr wählt Code aus und verwirft den anderen Zweig
  • enable_if steuert die Überladungsauflösung über SFINAE
  • Traits lassen sich mit logischen Operatoren kombinieren

Häufig gestellte Fragen

Ist die Lektion „Bedingte Logik“ kostenlos?

Ja — der vollständige Text von „Bedingte Logik“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Bedingte Logik“?

std::conditional und if constexpr Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Bedingte Logik“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Typen abfragen
  2. Typen umwandeln
  3. Bedingte Logik
  4. Eigene Traits schreiben
← Zurück zu C++ Academy