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,
который проверяет условия на этапе компиляции