РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
6 of 815 menu

if constexpr

Конструкция if constexpr - это форма оператора if, которая позволяет выполнять ветвление во время компиляции. В отличие от обычного if, условие в if constexpr должно быть константным выражением, известным на этапе компиляции. Если условие истинно, компилируется первая ветка, если ложно - вторая (блок else). При этом код в невыбранной ветке полностью отбрасывается компилятором, что позволяет использовать его в шаблонах без генерации ошибок для неподходящих типов.

Первый параметр - это условие, которое должно быть константным выражением. Второй параметр - блок кода, который выполняется при истинном условии. Также можно указать блок else для выполнения при ложном условии.

Синтаксис

if constexpr (condition) { // code if condition is true } else { // code if condition is false }

Пример

Давайте рассмотрим простой пример, где условие известно на этапе компиляции:

#include <iostream> using namespace std; int main() { if constexpr (sizeof(int) == 4) { cout << "int is 4 bytes" << endl; } else { cout << "int is not 4 bytes" << endl; } return 0; }

Результат выполнения кода:

"int is 4 bytes"

Пример

Давайте используем if constexpr в шаблонной функции для обработки разных типов:

#include <iostream> #include <string> using namespace std; template <typename T> void print(const T& value) { if constexpr (is_integral_v<T>) { cout << "Integer: " << value << endl; } else { cout << "Other: " << value << endl; } } int main() { print(42); print("abcde"); return 0; }

Результат выполнения кода:

"Integer: 42" "Other: abcde"

Пример

Давайте проверим, что невыбранная ветка не компилируется. В этом примере код с ошибкой находится в ветке, которая не будет скомпилирована:

#include <iostream> using namespace std; template <typename T> void check() { if constexpr (sizeof(T) > 2) { cout << "Large type" << endl; } else { cout << "Small type" << endl; } } int main() { check<int>(); check<char>(); return 0; }

Результат выполнения кода:

"Large type" "Small type"

Смотрите также

  • оператор if,
    который выполняет ветвление во время выполнения
  • оператор else,
    который задаёт альтернативную ветку для if
  • ключевое слово constexpr,
    которое позволяет вычислять значения на этапе компиляции
  • оператор static_assert,
    который проверяет условия на этапе компиляции
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить