Spec-Zone.ru › C++

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) получает тип выражения или сущности
is_type
(C++26)
проверяет, представляет ли отражение тип
(функция)
same_as
(C++20)
задаёт, что тип совпадает с другим типом
(концепт)
is_same
(C++11)
проверяет, совпадают ли два типа
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/is_same_type

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API