Ключевое слово 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,
который проверяет целочисленный тип