随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

理解 traits

1、为什么使用traits?

  考虑下面的需求,实现一个方法Advance(iter,n),接收一个迭代器iter和移动距离n,将iter向前移动n个距离。

  分析,因为存在不同类型的迭代器,做同一件事情,大家的能力不一样,做法当然不一样。有的迭代器可以一下子移到目标,有的迭代器只能一步一步移动,进行n次。因此,在方法内,必须要判断迭代器的类型,然后进行相应的操作。这种方法当然不好,运行期判断类型,需要核对继承层次中的每个类,效率差。有没有更好的办法呢?

2、解决办法:

  a、每个迭代器暴露一个接口,暴露自己类型的别名(使用typedef MyType Category),每个迭代器都使用相同的别名。再使用一个traits类模版,对迭代器封装,对外暴露迭代器类型的别名,也就是内部迭代器的类型别名(使用 typedef iter::Category Category)。

  b、建立多个重载方法,根据迭代器类型的真名,进行重载。

  c、在Advance方法内,对iter封装,根据类型别名,调用重载的方法。

3、分析编译器编译过程,看到Advance方法,对迭代器封装后,暴露的Category就是iter 的Category,也就是迭代器的类型别名,在编译时期,就可以知道迭代器的类型真名,因此,在编译期就可以确定下来调用哪个重载方法。

4、其实这种场景,如果是自己的代码,更应该使用运行时多态(重写)实现上面的需求。

posted on   Andy Niu  阅读(363)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示