Traits (计算机科学)

C++编程中的traits

C++标准模板库中大量使用了traits。将因为模板形参（包括类型形参、非类型形参）不同而导致的不同抽取到新的模板（即traits）中去；然后通过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);}