1 decay_t
进行类型退化
- 这是
decay_t
的声明,decay_t
是decay<_Tp>::type
的别名
template<typename _Tp>
using decay_t = typename decay<_Tp>::type;
- 这里是
decay
类的定义。
首先,除去_Tp类型的引用限定符。
之后,对去掉引用限定符的__remove_type
进行处理
template<typename _Tp>
class decay
{
typedef typename remove_reference<_Tp>::type __remove_type;
public:
typedef typename __decay_selector<__remove_type>::__type type;
};
- 这里是对
__remove_type
的处理
__decay_selector
定义了三个特例化版本,分别对应于对普通类型、数组类型和函数:
- 普通类型:去掉cv限定符
- 数组类型:退化为指针类型
- 函数类型:退化为函数指针类型
template<typename _Up,
bool _IsArray = is_array<_Up>::value,
bool _IsFunction = is_function<_Up>::value>
struct __decay_selector;
// NB: DR 705.
template<typename _Up>
struct __decay_selector<_Up, false, false>
{ typedef __remove_cv_t<_Up> __type; };
template<typename _Up>
struct __decay_selector<_Up, true, false>
{ typedef typename remove_extent<_Up>::type* __type; };
template<typename _Up>
struct __decay_selector<_Up, false, true>
{ typedef typename add_pointer<_Up>::type __type; };
2 add修饰符
1 add_const
添加顶层const
template<typename _Tp>
using add_const_t = typename add_const<_Tp>::type;
template<typename _Tp>
struct add_const
{ typedef _Tp const type; };
2 add_volatile
添加v限定符
template<typename _Tp>
struct add_volatile
{ typedef _Tp volatile type; };
3 add_cv
添加cv限定符
使用了到 add_const
和add_volaile
分别添加c和v限定符
template<typename _Tp>
struct add_cv
{
typedef typename
add_const<typename add_volatile<_Tp>::type>::type type;
};
3 remove修饰符
1 remove_const
去除顶层const
template<typename _Tp>
using remove_const_t = typename remove_const<_Tp>::type;
template<typename _Tp>
struct remove_const
{ typedef _Tp type; };
template<typename _Tp>
struct remove_const<_Tp const>
{ typedef _Tp type; };
2 remove_volatile
去除v限定符
template<typename _Tp>
struct remove_volatile
{ typedef _Tp type; };
template<typename _Tp>
struct remove_volatile<_Tp volatile>
{ typedef _Tp type; };
3 remove_cv
去除cv限定符
四个特例化版本分别对应四种情况:
- 没有cv限定符
- 有c限定符
- 有v限定符
- 有cv限定符
template<typename _Tp>
struct remove_cv;
template<typename _Tp>
struct remove_cv
{ using type = _Tp; };
template<typename _Tp>
struct remove_cv<const _Tp>
{ using type = _Tp; };
template<typename _Tp>
struct remove_cv<volatile _Tp>
{ using type = _Tp; };
template<typename _Tp>
struct remove_cv<const volatile _Tp>
{ using type = _Tp; };
4 type_identity
在某些情况下,希望返回原始类型。
比如:在模板推断出现问题时,我们希望返回原始类型。
template<typename _Tp>
struct type_identity { using type = _Tp; };
template<typename _Tp>
using type_identity_t = typename type_identity<_Tp>::type;
5 underlying_type
获取枚举类型的底层基础类型
template<typename _Tp>
using underlying_type_t = typename underlying_type<_Tp>::type;
例如
enum class En : unsigned long { En1, En2, En3 };
int main() {
std::cout << __cplusplus << std::endl;
using type = std::underlying_type_t<En>;
auto val1 = static_cast<type>(En::En1);
auto val2 = static_cast<type>(En::En2);
auto val3 = static_cast<type>(En::En3);
}
6 invoke_result_t
推导出返回值类型
C++11的 result_of
废除了
template<typename _Fn, typename... _Args>
using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;