Пространства имён
Варианты
Действия

std::is_same

Материал из cppreference.com
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
<tbody> </tbody>
Определено в заголовочном файле <type_traits>
template< class T, class U > struct is_same;
(начиная с C++11)

Если T и U именуют один и тот же тип (принимая во внимание квалификацию const/volatile), предоставляет константу-элемент value, равную true. Иначе value равна false.

Коммутативность выполняется, т.е. для любых двух типов T и U, is_same<T, U>::value == true, если и только если is_same<U, T>::value == true.

Поведение программы, добавляющей специализации для std::is_same или std::is_same_v (начиная с C++17) не определено.

Вспомогательная шаблонная переменная

<tbody> </tbody>
template< class T, class U > inline constexpr bool is_same_v = is_same<T, U>::value;
(начиная с C++17)

Унаследован от std::integral_constant

Константы элементы

value
[static]
true, если T и U одного типа , false иначе
(public static константа-элемент)

Функции-элементы

operator bool
преобразует объект в bool, возвращает value
(public функция-элемент)
operator()
(C++14)
возвращает value
(public функция-элемент)

Типы элементы

Тип Определение
value_type bool
type std::integral_constant<bool, value>

Возможная реализация

template<class T, class U>
struct is_same : std::false_type {};

template<class T>
struct is_same<T, T> : std::true_type {};

Пример

#include <cstdint>
#include <iostream>
#include <type_traits>

int main()
{
    std::cout << std::boolalpha;

    // некоторые факты, определяемые реализацией

    // обычно true, если 'int' 32-битный
    std::cout << std::is_same<int, std::int32_t>::value << ' '; // возможно true
    // возможно true, если используется модель данных ILP64
    std::cout << std::is_same<int, std::int64_t>::value << ' '; // возможно false

    // те же тесты, что и выше, за исключением использования формата C++17
    // std::is_same_v<T, U> format
    std::cout << std::is_same_v<int, std::int32_t> << ' ';  // возможно true
    std::cout << std::is_same_v<int, std::int64_t> << '\n'; // возможно false

    // сравнивает типы пары переменных
    long double num1 = 1.0;
    long double num2 = 2.0;
    static_assert( std::is_same_v<decltype(num1), decltype(num2)> == true );

    // 'float' никогда не является целочисленным типом
    static_assert( std::is_same<float, std::int32_t>::value == false );

    // 'int' неявно 'знаковый'
    static_assert( std::is_same_v<int, int> == true );
    static_assert( std::is_same_v<int, unsigned int> == false );
    static_assert( std::is_same_v<int, signed int> == true );

    // в отличие от других типов, 'char' не является ни 'без знаковым', ни 'знаковым'
    static_assert( std::is_same_v<char, char> == true );
    static_assert( std::is_same_v<char, unsigned char> == false );
    static_assert( std::is_same_v<char, signed char> == false );

    // const-квалифицированный тип T не совпадает с неконстантным T
    static_assert( !std::is_same<const int, int>() );
}

Возможный вывод:

true false true false

Смотрите также

(C++20)
указывает, что тип совпадает с другим типом
(концепт) [править]
спецификатор decltype(C++11) получает тип выражения или сущности[править]