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 ausif constexprwählt Code aus und verwirft den anderen Zweigenable_ifsteuert 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
- Typen abfragen
- Typen umwandeln
- Bedingte Logik
- Eigene Traits schreiben