traits简单认识

我不知道官方或一些书上是如何去解释traits的,我的理解是:

当函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时),traits会是一种很好的解决方案。

本以为能很简单的描述它,谁知道还是用了如此长的句子才说明清楚,相当的惭愧。大家只要有个大概的概念就ok了,甚至即使完全没概念也没关系,下面会通过实际代码来说明。

先看这样一个例子。如果有一个模板类Test:

 template <typename T> 
 class Test { 
      ...... 
 }; 

假设有这样的需求:类Test中的某部分处理会随着类型T的不同而会有所不同,比如希望判断T是否为指针类型,当T为指针类型时的处理有别于非指针类型,怎么做?模板里再加个参数,如下:

 template <typename T, bool isPointer> 
 class Test { 
      ......// can use isPointer to judge whether T is a pointer 
 }; 

然后用户通过多传一个模板类型来告诉Test类当前T是否为指针。(Test<int*, true>)

很抱歉,所有的正常点的用户都会抱怨这样的封装,因为用户不理解为什么要让他们去关心自己的模板类型是否为指针,既然是Test类本身的逻辑,为什么麻烦用户呢?(即减少用户级的代码)

由于我们很难去限制用户在使用模板类时是使用指针还是基本数据类型还是自定义类型,而用常规方法也没有很好的方法去判断当前的T的类型。traits怎么做呢?

定义traits结构:

 template <typename T> 
 struct TraitsHelper { 
      static const bool isPointer = false; 
 }; 
 template <typename T> 
 struct TraitsHelper<T*> { 
      static const bool isPointer = true; 
 }; 

也许你会很困惑,结构体里就一个静态常量,没有任何方法和成员变量,有什么用呢?解释一下,第一个结构体的功能是定义所有TraitsHelper中isPointer的默认值都是false,而第二个结构体的功能是当模板类型 T 为指针时,isPointer的值为true。也就是说我们可以如下来判断当前类型:

  • TraitsHelper::isPointer值为false, 可以得出当前类型int非指针类型
  • TraitsHelper

你可能感兴趣的:(traits简单认识)