Traits (计算机科学)

维基百科,自由的百科全书
跳转至: 导航搜索

Traits面向对象程序设计中,是一个不可实例化(uninstantiable)的方法集合,为一个类提供了实现自身界面的功能。

C++编程中的traits[编辑]

C++标准模板库中大量使用了traits。一个traits包括了enum、typedef、模板偏特化(template partial specialization)。其中,enum定义了各种类的标识的统一表示;typedef定义了各个类的各自不同的类型定义,这对于使用模板元编程(template meta-programming)的灵活性非常重要;模板偏特化用于实现各个类的不同功能。

示例[编辑]

假设有一个容器模板类,其包含元素的值类型可以是内生(built-in)的数据类型,也可以是自定义的类。因此,有的值类型支持move操作,有的值类型不支持move操作。该容器模板类具有统一的界面,但对不同的值类型实现了不同的语义功能。为此:

#include <iostream>
 
struct no_move{};//两个marker类型
struct has_move{};
 
struct myValueType{
  public: void move(){std::cout<<"move a myValueType obj."<<std::endl;}
};
 
template <typename T> struct traits{
  typedef no_move move_method; //对于traits模板类,默认为无move方法
  void move(T* p){}//默认为无move方法
};
 
template <> struct traits<myValueType>{
  typedef has_move move_method;//对于myValueType,traits模板偏特化,定义了有move方法
  void move(myValueType* p){p->move();} //模板特化,有move方法
};
 
template <typename T> struct Container{
  void move(T* p){traits<T>().move(p);};
};
 
int main()
{
  int i=101;
  int *p1=&i;
  myValueType v1;
  myValueType *pv=&v1;
  Container<int> c1;
  Container<myValueType> c2;
  c1.move(p1);
  c2.move(pv);
}