boost元编程学习笔记

上传人:xiao****1972 文档编号:84136116 上传时间:2019-03-02 格式:DOCX 页数:3 大小:22.83KB
返回 下载 相关 举报
boost元编程学习笔记_第1页
第1页 / 共3页
boost元编程学习笔记_第2页
第2页 / 共3页
boost元编程学习笔记_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《boost元编程学习笔记》由会员分享,可在线阅读,更多相关《boost元编程学习笔记(3页珍藏版)》请在金锄头文库上搜索。

1、Boost 元编程学习笔记(三)Bruce Wang email:b-类型联合在C+中,能够被在编译期操作的实体被称为元数据。元数据又被分为两类:类型和非类型。所有的元数据都能被用作模板参数。常量整形值也是非类型之一,非类型包含了几乎所有能在编译期被认知的值。枚举,指针和函数引用,全局对象和成员指针。在标准中,模板也被允许作为模板参数传递。你可能会感到困惑。虽然,模板不是类型,并且不能作为类型被传递给另一个模板,但是,模板能被处理为描述目的的类型。使用非类型的元数据去计算是很容易想象的,但是,让你去计算类型数据,可能就会使你惊讶不已了。我们现在看看C+标准库中最简单的算法: iter_swap

2、. 它是职责是交换两个引用对象的值,像下面的代码: template void iter_swap(ForwardIterator1 i1, ForwardIterator2 i2) T tmp = *i1; *i1 = *i2; *i2 = tmp; 你一定会说,我的神啊,这个T 是从哪里来的啊?它没有被定义,这个代码也不能被编译通过。非常好,你有一双锐利的眼睛。当然了 ,通常T是你iterator被引用时,你得到的类型。但是C+标准库是怎么知道T 是值类型的呢?我们怎么去命名那个类型呢?直接接近法现在,我们去想象一下。我们自己实现了C+标准库并且在挑选处理iterators的方法。 我们将

3、要写很多的算法,并且这些算法需要在iterator类型和它的值类型之间创建一个联合。我们要求所有的iterator实现提供一个被嵌套的类型,称为value_type. 我们就能直接访问它了: template void iter_swap(ForwardIterator1 i1, ForwardIterator2 i2) typename / (see Language Note) ForwardIterator1:value_type tmp = *i1; *i1 = *i2; *i2 = tmp; 创建一个类联合个很好的策略,但它并不通用。在特殊情况下,C+中的iterator 被模塑成指

4、针,很不幸,指针不能有嵌套类型,那是类的特权。 void f(int* p1, int* p2) iter_swap(p1,p2); / error: int* has no member value_type 曲径通幽处我们虽然不能为所有iterator创建一个嵌套类:value_type ,但我们能添加这个嵌套类到模板。这个模板使用iterator类型做参数,在标准库中,这个模板被称作 iterator_traits, 有一个简单的签名。 template struct iterator_traits;现在我们把这个模板放入我们的iter_swap: template void iter_

5、swap(ForwardIterator1 i1, ForwardIterator2 i2) typename iterator_traits:value_type tmp = *i1; *i1 = *i2; *i2 = tmp; iterator_traits 所以这样命名,是因为它描述了它参数的特性。在这个例子中, traits是 iterator 的五个被联合的类型: value_type, reference, pointer, difference_type, 和 iterator_category.traits 模板最重要的特点是它们给我们一个途径,让我们能非侵入地联合一个类型的信

6、息。比如,你的一个同事Hector,给了你一些iterator类型,称为hands_off,它引用到 int, 你能赋给一个value_type,而且不破坏你们工作组的默契。你所需要做的就是显示的添加一个iterator_traits的专门化,当iter_swap 询问Hector 的value_type时, iter_swap 将看到类型int。关于模板的专门化和实例化,我们将在日后的学习中,进行简但的复习和回顾。 namespace std template struct iterator_traits typedef int value_type; four more typedefs.

7、 ; Traits 的非侵入性特征是使iterator_traits 为指针工作的保障,标准库中包含了下面iterator_traits的专门化, 它描述了所有指针的value_: template struct iterator_traits typedef T value_type; .four more typedefs ;找寻捷径当专门化成为一个被人喜爱的通用机制时,它远非像添加一个嵌套类到类那样方便。专门化带来了很多的累赘:你可能必须去关闭你正在工作其中的或正在打开的traits模板命名空间。然后你必须写traits专门化它本身的文本。仔细思考一下,标准库提供了一个捷径,允许iter

8、ator的作者仅仅写iterator的成员的类型,就能去控制被嵌套在他的 iterator_traits中的类型。iterator_traits 原模板搜索进入到iterator去抓去它的成员类型。请参考C+标准库普通模板声明和定义相对局部的或显示专门化的原模板。 template struct iterator_traits typedef typename Iterator:value_type value_type; .four more typedefs ;到这里,你已经看到了我们使用非直接的扩展代替直接接近到Iterator: value_type, iter_swap 通过访问iterator_traits 得到了iterator的value_type.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号