Переменная is_same_v
Переменная is_same_v из заголовочного файла <type_traits>
проверяет, совпадают ли два типа. В первый параметр
мы передаем первый тип для сравнения, а во второй -
второй тип. Результатом является значение типа bool:
true, если типы одинаковые, и false, если разные.
Переменная is_same_v является сокращенной формой
для is_same<T, U>::value. Она удобна тем, что
не требует писать ::value и позволяет использовать
результат напрямую в условиях if constexpr,
static_assert и других конструкциях.
Синтаксис
is_same_v<T, U>
Пример
Давайте сравним два одинаковых типа int и int:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
cout << is_same_v<int, int> << endl;
return 0;
}
Результат выполнения кода:
1
Пример
А теперь сравним два разных типа int и double:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
cout << is_same_v<int, double> << endl;
return 0;
}
Результат выполнения кода:
0
Пример
Переменная is_same_v часто используется
в if constexpr для выбора поведения
в зависимости от типа. Давайте напишем функцию,
которая по-разному работает с int и другими типами:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
void check(T value)
{
if constexpr (is_same_v<T, int>) {
cout << "int: " << value << endl;
} else {
cout << "other: " << value << endl;
}
}
int main()
{
check(123);
check(1.5);
return 0;
}
Результат выполнения кода:
"int: 123"
"other: 1.5"
Пример
Также is_same_v удобно применять
в static_assert для проверки типов
на этапе компиляции:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
T add(T a, T b)
{
static_assert(is_same_v<T, T>, "types must match");
return a + b;
}
int main()
{
cout << add(1, 2) << endl;
cout << add(1.5, 2.5) << endl;
return 0;
}
Результат выполнения кода:
3
4
Смотрите также
-
переменная
is_same,
которая является классом-оберткой для проверки типов -
переменная
is_integral_v,
которая проверяет, является ли тип целочисленным -
переменная
decay,
которая преобразует тип к базовому виду -
переменная
if constexpr,
которая выбирает ветку кода на этапе компиляции