Класс decay
Класс decay из заголовочного файла <type_traits> выполняет
приведение типа, аналогичное неявному преобразованию при передаче аргумента
в функцию по значению. Он удаляет ссылки, удаляет cv-квалификаторы
(const и volatile), а также преобразует типы массивов
в указатели, а типы функций - в указатели на функции. Класс имеет
единственный параметр шаблона - тип, который нужно преобразовать.
Синтаксис
template <class T>
struct decay;
Пример
Давайте применим decay к ссылочному типу и посмотрим,
как изменится тип:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
using T1 = decay<int&>::type;
using T2 = decay<const int&>::type;
cout << is_same<T1, int>::value << endl;
cout << is_same<T2, int>::value << endl;
return 0;
}
Результат выполнения кода:
1
1
Пример
Давайте применим decay к массиву и функции:
#include <iostream>
#include <type_traits>
using namespace std;
int foo(int);
int main()
{
using T1 = decay<int[5]>::type;
using T2 = decay<int(int)>::type;
cout << is_same<T1, int*>::value << endl;
cout << is_same<T2, int(*)(int)>::value << endl;
return 0;
}
Результат выполнения кода:
1
1
Пример
Давайте используем decay вместе с decay_t
для упрощения записи:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
decay_t<const int&> x = 42;
decay_t<int[3]> y = nullptr;
cout << x << endl;
cout << (y == nullptr) << endl;
return 0;
}
Результат выполнения кода:
42
1
Смотрите также
-
класс
remove_reference,
который удаляет ссылку из типа -
класс
is_same,
который проверяет совпадение типов -
класс
enable_if,
который условно включает шаблон -
класс
conditional,
который выбирает тип по условию