std::meta::is_same_type
Определён в заголовочном файле <meta> | ||
|---|---|---|
consteval bool is_same_type( std::meta::info r1, std::meta::info r2 ); | (начиная с C++26) |
Если два отражения r1 и r2 представляют один и тот же тип (с учётом квалификаторов cv), возвращает true. В противном случае возвращает false.
Выполняется коммутативность, то есть для любых двух отражений:
is_same_type(r1, r2) == true тогда и только тогда, когда
is_same_type(r2, r1) == true.
Параметры
| r1, r2 | - | отражения для сравнения |
Возвращаемое значение
true, если r1 и r2 представляют один и тот же тип, в противном случае — false.
Исключения
Выбрасывает std::meta::exception, если r1 или r2 не представляет тип или псевдоним типа.
Примечания
Если r1 является отражением типа int, а r2 — отражением псевдонима типа int, то r1 == r2 — это false, но std::meta::is_same_type(r1, r2) — это true. Кроме того, r1 == std::meta::dealias(r2) — это true.
Пример
#include <cstdint>
#include <meta>
#include <print>
constexpr long double num1{1.0};
constexpr long double num2{2.0};
static_assert
(""
// compare the types of a couple variables
&& is_same_type(^^decltype(num1), ^^decltype(num2))
// ‘float’ is never an integral type
&& !is_same_type(^^float, ^^int32_t)
// ‘int’ is implicitly ‘signed’
&& is_same_type(^^int, ^^int)
&& !is_same_type(^^int, ^^unsigned int)
&& is_same_type(^^int, ^^signed int)
// unlike other types, ‘char’ is neither ‘unsigned’ nor ‘signed’
&& is_same_type(^^char, ^^char)
&& !is_same_type(^^char, ^^unsigned char)
&& !is_same_type(^^char, ^^signed char)
// const-qualified type T is not same as non-const T
&& !is_same_type(^^const int, ^^int)
);
#define SHOW(...) std::println("{} == {}", #__VA_ARGS__, __VA_ARGS__)
int main()
{
// Some implementation-defined facts:
// usually true if ‘int’ is 32 bit
SHOW(is_same_type(^^int, std::meta::dealias(^^int32_t))); // maybe true
// possibly true if ILP64 data model is used
SHOW(is_same_type(^^int, std::meta::dealias(^^int64_t))); // maybe false
}
Возможный вывод:
is_same_type(^^int, std::meta::dealias(^^int32_t)) == true is_same_type(^^int, std::meta::dealias(^^int64_t)) == false
См. также
спецификатор decltype(C++11) | получает тип выражения или сущности |
|
(C++26) | проверяет, представляет ли отражение тип (функция) |
|
(C++20) | задаёт, что тип совпадает с другим типом (концепт) |
|
(C++11) | проверяет, совпадают ли два типа (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/is_same_type