C++ STL和泛型编程(四)----type traits
一、源码实现(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{}即返回假。