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

std::type_identity

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(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)
type_identity
(C++20)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <type_traits>
template< class T >
struct type_identity;
(начиная с C++20)

Предоставляет typedef элемент type с именем T (т.е. преобразование идентичности).

Поведение программы, добавляющей специализации для std::type_identity не определено.

Содержание

[править] Типы элементы

Имя Определение
type T

[править] Вспомогательные типы

template< class T >
using type_identity_t = typename type_identity<T>::type;
(начиная с C++20)

[править] Возможная реализация

template< class T >
struct type_identity {
    using type = T;
};

[править] Примечание

type_identity можно использовать для установления невыведенных контекстов при выводе аргументов шаблона.

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_type_identity 201806L (C++20) std::type_identity

[править] Пример

#include <iostream>
#include <type_traits>
 
template <class T>
T foo(T a, T b) {
  return a + b;
}
 
template <class T>
T bar(T a, std::type_identity_t<T> b) {
  return a + b;
}
 
int main() {
  // foo(4.2, 1); // ошибка, выведены конфликтующие типы для 'T'
  std::cout << bar(4.2, 1) << '\n';  // OK, вызывает bar<double>
}

Вывод:

5.2