对traits技法比较熟的大虾们进来判断一下我的总结

softworm163 2003-07-27 12:22:50
当你想将自建型别作为STL的扩展,为STL容器、算法针对此型别作效率的最大强化,
哪应该改写哪些东西?

一、iterator_traits
首先,你必需为创建一个iterator_traits目录表,说明这个对像型别支持何种concepts:input_iterator?forward_iterator?random_access_iterator?这些concept的category你都应该typedef好,
以便stl的traits类别、概念萃取机能正常地把它萃取出来,具体方法就是在类体定加入几个typedef

typedef user_type value_type
typedef value_type* iterator
...
typedef input_iterator_tag iterator_category

然后,STL各大算法便可以以这种方法萃取出你的类型相关的资料:
__advance( i , n , iterator_category( user_type ) );//萃取concept.
typename iterator_traits<user_type*>::value_type//萃取型别资料

二、STL的私房菜:__type_traits
这个很简单,你只要为__type_traits<T>做一个偏特化版本,说明这个具备型别哪些特性:
是否pod类型?有没有destructor?有没有default/copy constructor?有没有assignment operator?当重载了以后,STL的各大算法、各大容器就可以俾这个萃取出适当的concept以供给各大重载版本,对算法更加强化其效率!



--------------------------
看了STL源码剖析半个小时得出的结论,
希望 觉得对traits技术比较熟愁的大虾给予指证
我说得对吗?偶分不多,先给50
...全文
39 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
softworm163 2003-07-28
  • 打赏
  • 举报
回复
up
xiaoyunet 2003-07-28
  • 打赏
  • 举报
回复
当然如果你的自定义类型具有迭代器,可以用iterator_traits进行说明。

我的理解就是这样,欢迎探讨。
xiaoyunet 2003-07-28
  • 打赏
  • 举报
回复
就我的理解,你的第一步多余,自定义类型不必说明iterator_traits.
iterator_traits是容器为自己的迭代器进行说明。

对于__type_traits的是必要的。方法如你所说。
softworm163 2003-07-27
  • 打赏
  • 举报
回复
漏了一句:
typedef typename __type_traits<user_type>::is_POD_type is_POD;
softworm163 2003-07-27
  • 打赏
  • 举报
回复
class user_define
{
typedef user_type value_type;//简单假设,路人甲乙丙
typedef value_type iterator;//简单假设,路人甲乙丙
//...
}

__STL_TEMPLATE_NULL struct __type_traits<user_define>{
typedef __true_type has_trival_default_constructor;
typedef __true_type_has_trival_copy_constructor;
//...
}


到此为此__advance()和__distance()就可以萃取出它的特性:
user_type::iterator iter=user_type_object.begin();
user_type::iterator iter_end=user_type_object.end();


__advance(iter,iLength,iterator_category(iter));//now they can work more effective
__uninitialized_fill_aux(iter,iter_end,user_type_object,is_POD());));//now they can work more effective

MaiCle 2003-07-27
  • 打赏
  • 举报
回复
能不能给个相关的例子呢?这么看等于还在看理论呵。
softworm163 2003-07-27
  • 打赏
  • 举报
回复
up
softworm163 2003-07-27
  • 打赏
  • 举报
回复
是不是太简单大家不肯答

还是分太少不愿答?
softworm163 2003-07-27
  • 打赏
  • 举报
回复
楼上的那位好像信誉很惨,

我也被人扣了两分

不知可以怎样补回来?
扶老人过马路?
TomandJerry 2003-07-27
  • 打赏
  • 举报
回复
你半个小时就出来了阿,厉害,我研究了2天才明白原理,向你请教
firingme 2003-07-27
  • 打赏
  • 举报
回复
trait技术在BOOST里面做得很全面了

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧