我对C++ Traits编程技法的一点点理解

来源:互联网 发布:索尼c6802怎么清除数据 编辑:程序博客网 时间:2024/05/19 20:38

第一次听说traits是在一次电话面试中,当时还没有听说过这个词。之后查过资料,但也不是十分明白,直到今天重新看了一下《STL源码剖析》,稍微有一些想法。

1. traits是模板编程里面的一个编程技法。可能因为不是面向对象的,所以算不上一种设计模式。虽然traits本身一般实现为模板(itrator_traites<T>,以及__type_traits<T>等),但和智能指针(auto_ptr<T>)这种比较大众的模板相比,traits的用法又有点宽泛,所以感觉说traits是一种编程技法是比较保险的。

2. traits是STL里面非常重要的概念,所以我觉得用STL来体会traits是有帮助的。而提起STL,其主要内容就是容器和算法,连接两者的的纽带就是迭代器。由于迭代器遇到了一些问题,于是需要traits这种技法的帮助。当然也可能是先有traits这种技法,然后才决定用迭代器以及容器和算法分离的方式来实现STL。

3. traits是“萃取”还是“特性”的意思?侯捷说是“特性萃取机”和“榨汁机”。我的理解是,通过偏特化的机制,把特性信息过滤出来——榨汁。比如下面的特化版本,分别把T*和const T*过滤出来T。从而解决了原生指针提取类型特征的问题。

template<class T>struct iterator_traits<T*> {    typedef T value_type;};

template<class T>struct iterator_traits<const T*> {    typedef T value_type;};
4. 在iterator中,traits除了解决value type的问题,还可以提取其他的4种类型信息:iterator category、difference type、pointer、reference。在__type_traits<T>中,traits用来提取类的拷贝控制和析构的类型,其用法也有点傻,内建类型都hard code了一遍,例如__type_traits<char>。

5. 上网看了看其他人的讲解,各自有各自的例子,但都没有STL iterator的好理解,所以还是看不懂,然后也不知道我自己的理解是否正确。所以先写出来,等以后回头再看的时候,有个对比吧。

0 0
原创粉丝点击