__type_traits 编程纪要

 
Type Traits即类型属性。C++类型本身不具有某些我们感兴趣的属性信息,例如(拷贝)构造、析构函数,以及赋值运算符是否Trival,所以我们应当采用某些手段来记录这些信息。这些信息有助于针对某种类型选择最佳的方法。当然我们也可以在类中添加字段来记录这些信息,但这样一来增加了类的负担,二来只能在运行时访问,影响效率。最好的方式当然是在编译时刻就能确定。
 
先给出SGI STL中__type_traits的定义(这是一个模板,可以针对各种类型进行特化):
template <class _Tp>
struct __type_traits {
   typedef __true_type     this_dummy_member_must_be_first;
  typedef __false_type     has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
   typedef __false_type    is_POD_type;
};
其中:
Struct __true_type{};
Struct __false_type{};
 
下面我们将讲述__type_traits在编程过程中的应用:
假如一个函数Function接受类型为T的参数,针对该参数的类型,我们选择适当的处理方法。
【首要的条件是已经存在__type_traits关于类型T的特化版本,当然也可以用它的缺省版本。】
1.       建立该函数(Function)的两个辅助 重载“子函数”(Function_aux),这两个子函数不仅接受原来的T型函数,另外还接受一个参数,分别为__true_type或者__false_type类型的参数。【编译时就是靠这个附加参数来选择恰当的子函数。】
 
2.       获取T类型中我们感兴趣的类型信息。比如:
__type_taits<T>:: has_trivial_copy_constructor, 一般为了简便,我们会做一步typedef,
typedef typename __type_taits<T>:: has_trivial_copy_constructor isTrivalCtor;
这样我们得到一个潜在的、可以为__true_type,也可以为__false_type的类型定义。
 

3. 在Function中调用子函数:
Function_aux( t, isTrivalCtor() )
【注意:最后这个参数带有“()”,这是没办法的办法,C++不能将类型作为变量使用,不像Python那么灵活。】。
最后这个参数是一个__true_type或者__false_type类型的对象。正是因为其类型不同,所以可以在编译时刻即确定应当选用的重载函数。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值