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

Ключевое слово if constexpr

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

Синтаксис

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

Пример

Давайте напишем шаблонную функцию, которая возвращает разные значения в зависимости от типа. Для целых чисел вернём 1, а для остальных типов - 0:

#include <iostream> #include <type_traits> using namespace std; template <typename T> int getValue(T value) { if constexpr (is_integral_v<T>) { return 1; } else { return 0; } } int main() { cout << getValue(42) << endl; cout << getValue(3.14) << endl; return 0; }

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

1 0

Пример

Давайте обработаем строку и число по-разному с помощью if constexpr. Для строки выведем её длину, а для числа - само число:

#include <iostream> #include <string> #include <type_traits> using namespace std; template <typename T> void print(T value) { if constexpr (is_same_v<T, string>) { cout << value.length() << endl; } else { cout << value << endl; } } int main() { print(string("abcde")); print(42); return 0; }

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

5 42

Пример

Давайте покажем, что невыбранная ветка полностью отбрасывается и не вызывает ошибку компиляции. Для типа int вызовем size, которого у него нет, но эта ветка не будет скомпилирована:

#include <iostream> #include <string> #include <type_traits> using namespace std; template <typename T> void show(T value) { if constexpr (is_same_v<T, string>) { cout << value.size() << endl; } else { cout << value << endl; } } int main() { show(12345); return 0; }

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

12345

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

  • ключевое слово template,
    которое объявляет шаблон
  • ключевое слово typename,
    которое объявляет параметр шаблона
  • тип is_same,
    который проверяет совпадение типов
  • тип is_integral,
    который проверяет целочисленный тип
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить