C++ 中Traits技术 (2) —— 与迭代器
2016-04-13 23:57
435 查看
接着了解C++中的Traits技术。
Traits技术可以获取一个类型的相关信息。
比如针对一个泛型迭代器,类型参数T表示迭代器所指向的类型。
比如我们可以为这个类加入一个内嵌类型
接下来我们要实现一个算法Fun,其返回值类型为参数所指向的类型。
比如,Fun函数我们可以这样写:
这样的话,所有定义了value_type内嵌类型的迭代器都可作为Fun()的参数。
目前,似乎我们的需求满足了,并没有什么bug,与traits技术好像也没什么关系。
但是当我们考虑将原生指针作为参数时,就会出现问题。原生指针内没有value_type内嵌类型。
OK,traits技术派上用场了。
我们使用单独的一个类获取value_type信息:
OK,这时我们要采用partial specialization(偏特化)。
关于特化和偏特化,将在下一篇中学习介绍。
Traits技术可以获取一个类型的相关信息。
比如针对一个泛型迭代器,类型参数T表示迭代器所指向的类型。
template < typename T> class CMyIterator { //... };我们使用这个迭代器时,如何才能知道这个迭代器所指向元素的类型呢?
比如我们可以为这个类加入一个内嵌类型
template < typename T> class CMyIterator { //... typedef T value_type; };那么我们可以通过CMyIterator::value_type获取迭代器所指向的类型。
接下来我们要实现一个算法Fun,其返回值类型为参数所指向的类型。
template <typename T> typename CMyIterator<T>::value_type Fun(CMyIterator<T> i) { //... }这里我们内嵌value_type这个类型的意义在于:我们希望Fun这个函数能够适应所有类型的迭代器。
比如,Fun函数我们可以这样写:
template <typename Iter> typename Iter::value_type Fun(Iter i) { //... }
这样的话,所有定义了value_type内嵌类型的迭代器都可作为Fun()的参数。
目前,似乎我们的需求满足了,并没有什么bug,与traits技术好像也没什么关系。
但是当我们考虑将原生指针作为参数时,就会出现问题。原生指针内没有value_type内嵌类型。
OK,traits技术派上用场了。
我们使用单独的一个类获取value_type信息:
template <typename T> class Traits { typedef typename T::value_type value_type; }; template <typename Iter> typename Traits<Iter>::value_type Fun(Iter i) { //... }不过好像并没有解决原生指针的问题。
OK,这时我们要采用partial specialization(偏特化)。
template <typename T> class Traits<T*> { typedef typename T value_type; }; template <typename Iter> typename Traits<Iter>::value_type Fun(Iter i) { //... }
关于特化和偏特化,将在下一篇中学习介绍。
相关文章推荐
- C++ 中Traits技术 (1) —— 初识
- C++中的函数指针用法
- C++的运算符重载
- 腾讯2016春季校园实习招聘技术岗复试(二面)问题汇总(CC++后台)
- 腾讯2016春季校园实习招聘技术岗复试(二面)问题汇总(CC++后台)
- C++中重定义、重写、重载的区别以及隐藏与覆盖的访问
- C++实验3-个人所得税计算器
- C++文件(流操作)(方式方法)
- 读书笔记--C语言接口与实现--异常和断言
- SIP:用Riverbank的SIP创建C++库的Python模块(把自己的C++库包装成Python模块)
- 最近做的一道c++作业题
- 配置Notepad++直接运行Python、Perl、C、C++、Java
- c++作业3
- C++学习篇——纯虚函数和抽象类
- [温故而知新] 《深度探索c++对象模型》——站在对象模型的尖端
- C++游戏系列6:自己动起来
- windows通过eclipse 搭建c/c++ IDE
- C++ Primer 第三章
- 用C语言画一个“爱心”
- C语言基础知识<6>