std::type_identity
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <type_traits>
|
||
template< class T > struct type_identity; |
(начиная с C++20) | |
Предоставляет typedef элемент type с именем T (т.е. преобразование идентичности).
Поведение программы, добавляющей специализации для std::type_identity не определено.
Типы элементы
| Имя | Определение |
type
|
T
|
Вспомогательные типы
<tbody> </tbody> 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