std::type_identity
Определён в заголовочном файле <type_traits> | ||
|---|---|---|
template< class T > struct type_identity; | (начиная с C++20) |
Предоставляет тип-член type, обозначающий T (то есть тождественное преобразование).
Если программа добавляет специализации для std::type_identity, поведение не определено.
Типы-члены
| Имя | Определение |
|---|---|
type |
T |
Вспомогательные типы
template< class T > using type_identity_t = type_identity<T>::type; | (начиная с C++20) |
Возможная реализация
template<class T>
struct type_identity { using type = T; };
|
Примечания
std::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); // error, deduced conflicting types for 'T'
std::cout << bar(4.2, 1) << '\n'; // OK, calls bar<double>
}
Вывод:
5.2
См. также
|
(C++20) | функциональный объект, возвращающий свой аргумент без изменений (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/type_identity