std:: is_same
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<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)
, поведение не определено.
Содержание |
Шаблон вспомогательной переменной
|
template
<
class
T,
class
U
>
constexpr bool is_same_v = is_same < T, U > :: value ; |
(начиная с C++17) | |
Наследуется от std:: integral_constant
Константы-члены
|
value
[static]
|
true
если
T
и
U
являются одним и тем же типом,
false
в противном случае
(публичная статическая константа-член) |
Функции-члены
|
operator bool
|
преобразует объект в
bool
, возвращает
value
(публичная функция-член) |
|
operator()
(C++14)
|
возвращает
value
(публичная функция-член) |
Типы-члены
| Тип | Определение |
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> #define SHOW(...) std::cout << #__VA_ARGS__ << " : " << __VA_ARGS__ << '\n' int main() { std::cout << std::boolalpha; // некоторые факты, зависящие от реализации // обычно true, если 'int' является 32-битным SHOW( std::is_same<int, std::int32_t>::value ); // возможно true // возможно true, если используется модель данных ILP64 SHOW( std::is_same<int, std::int64_t>::value ); // возможно false // те же тесты, что и выше, но с использованием формата std::is_same_v<T, U> из C++17 SHOW( std::is_same_v<int, std::int32_t> ); // возможно true SHOW( std::is_same_v<int, std::int64_t> ); // возможно 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' неявно является 'signed' 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' не является ни 'unsigned', ни 'signed' 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 ); // тип T с квалификатором const не совпадает с не-const T static_assert( !std::is_same<const int, int>() ); } #undef SHOW
Возможный вывод:
std::is_same<int, std::int32_t>::value : true std::is_same<int, std::int64_t>::value : false std::is_same_v<int, std::int32_t> : true std::is_same_v<int, std::int64_t> : false
Смотрите также
|
(C++20)
|
определяет, что тип совпадает с другим типом
(концепт) |
decltype
спецификатор
(C++11)
|
получает тип выражения или сущности |