C++ STL和泛型编程(四)----type traits

本文详细介绍了C++ STL中的Type Traits,包括源码实现、C++2.0的新特性、以及针对不同类的测试。Type Traits用于获取类型属性,如是否为void、是否为整数类型等,帮助优化代码性能。通过对Foo、Goo和Zoo类的测试,展示了Type Traits如何检测类的构造函数、多态性以及拷贝和移动构造函数的性质。
摘要由CSDN通过智能技术生成

一、源码实现(G2.9)

trivial表示平凡的,不重要的意思。

在这里插入图片描述
由上知,泛化版本的struct __type_traits其default_constructor,copy_constructor等等都是重要的,且都不是POD_type(一种class/struct内部只有data,而无function)!!

而对于一般的int型和double型,系统都默认编写了特化版本的struct __type_traits,其default_constructor,copy_constructor等等都不是重要的,因而在创建100万个int型或double型的数据时,通过其struct __type_traits<int>或struct __type_traits<double> 知,其不用调用100万次构造函数。而对于系统没有编写的其他类的struct __type_traits则要自己编写。

二、C2.0下

type traits可以回答更多的问题。
在这里插入图片描述
在这里插入图片描述

三、type traits测试

在这里插入图片描述
以上为测试的泛化版本,传入不同的类对象来进行对应特化版本的测试:

- class Foo

在这里插入图片描述
由type_traits_output(Foo())知,其构造函数等都不重要。

- class Goo

在这里插入图片描述
由上知,因为虚函数的存在,所以type_traits_output(Foo())得知其有多态【即 is_polymorphic 为 1】。

- class Zoo

在这里插入图片描述

Zoo(const Zoo&) = delete;表示其没有拷贝构造函数,所以 is_copy_constructible 为 0。
Zoo(Zoo&&) = default,&&表示后面所要讲的movable(类似浅拷贝,但又不是浅拷贝的操作,其是将原有指针删除,然后让新的东西指向原来的地址),所以 is_move_constructible 为 1。
。。。

四、type traits实现

- is_void

/// remove_const
template<typename _Tp>
struct remove_const{
	typedef _Tp  type;
};
template<typename _Tp>
struct remove_const<_Tp const>{  // 这里int const 和 const int是一样的,
	typedef _Tp  type;			 // 这个操作可以实现将传进来的int const的const去掉而只剩 int
};

/// remove_volatile
template<typename _Tp>
struct remove_volatile{
	typedef _Tp  type;
};
template<typename _Tp>
struct remove_volatile<_Tp volatitle>{
	typedef _Tp  type;
};

/// remove_cv
template<typename _Tp>
struct remove_cv{
	typedef typename
		remove_const<typename remove_volatitle<_Tp>::type>::type  type;
};

/// add_const
template<typename _Tp>
struct add_const{
	typedef _Tp  const type;
};

// 泛化版本,其默认回答为假
template<typename>
struct __is_void_helper: public false_type{};
// 特化版本,其默认回答为真
template<typename>
struct __is_void_helper<void>: public true_type{};

/// is_void
template<typename _Tp>
struct is_void: public __is_void_helper<typename remove_cv<_Tp>::type>::type{};

在判断是否为空类型时,先拿掉const和volatile,然后再进一步调用__is_void_helper来判断:

1.__is_void_helper<typename remove_cv<_Tp>::type>::type{}中,先去除cv调用remove_cv而进入remove_const<typename remove_volatitle<_Tp>::type>::type。而在此中,先调用remove_volatitle<_Tp>去除volatile关键字并返回type【即remove_const<_Tp1>::type】,然后去除const关键字。最终返回__is_void_helper<_Tp2>::type{}。

2.则此时若为_Tp2 = void,则调用特化版本struct __is_void_helper: public true_type{}即返回真;
若为_Tp2 != void,则调用泛化版本struct __is_void_helper: public false_type{}即返回假。

- is_integral

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值