欢迎来到天天文库
浏览记录
ID:34721945
大小:57.01 KB
页数:3页
时间:2019-03-10
《boost元编程学习笔记》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Boost元编程学习笔记(三)BruceWangemail:b-zwang@hotmail.com类型联合在C++中,能够被在编译期操作的实体被称为元数据。元数据又被分为两类:类型和非类型。所有的元数据都能被用作模板参数。常量整形值也是非类型之一,非类型包含了几乎所有能在编译期被认知的值。枚举,指针和函数引用,全局对象和成员指针。在标准中,模板也被允许作为模板参数传递。你可能会感到困惑。虽然,模板不是类型,并且不能作为类型被传递给另一个模板,但是,模板能被处理为描述目的的类型。使用非类型的元数据去计算是很容易想象的,但是,让你去计算
2、类型数据,可能就会使你惊讶不已了。我们现在看看C++标准库中最简单的算法:iter_swap.它是职责是交换两个引用对象的值,像下面的代码:templatevoiditer_swap(ForwardIterator1i1,ForwardIterator2i2){Ttmp=*i1;*i1=*i2;*i2=tmp;}你一定会说,我的神啊,这个T是从哪里来的啊?它没有被定义,这个代码也不能被编译通过。非常好,你有一双锐利的眼睛。当然了,通常T是你it
3、erator被引用时,你得到的类型。但是C++标准库是怎么知道T是值类型的呢?我们怎么去命名那个类型呢?直接接近法现在,我们去想象一下。我们自己实现了C++标准库并且在挑选处理iterators的方法。我们将要写很多的算法,并且这些算法需要在iterator类型和它的值类型之间创建一个联合。我们要求所有的iterator实现提供一个被嵌套的类型,称为value_type.我们就能直接访问它了:templatevoiditer_swap(Forw
4、ardIterator1i1,ForwardIterator2i2){typename//(seeLanguageNote)ForwardIterator1::value_typetmp=*i1;*i1=*i2;*i2=tmp;}创建一个类联合个很好的策略,但它并不通用。在特殊情况下,C++中的iterator被模塑成指针,很不幸,指针不能有嵌套类型,那是类的特权。voidf(int*p1,int*p2){iter_swap(p1,p2);//error:int*hasnomember'value_type'}曲径通幽处我们虽然不能
5、为所有iterator创建一个嵌套类::value_type,但我们能添加这个嵌套类到模板。这个模板使用iterator类型做参数,在标准库中,这个模板被称作iterator_traits,有一个简单的签名。templatestructiterator_traits;现在我们把这个模板放入我们的iter_swap:templatevoiditer_swap(ForwardIterator1i1,ForwardIte
6、rator2i2){typenameiterator_traits::value_typetmp=*i1;*i1=*i2;*i2=tmp;}iterator_traits所以这样命名,是因为它描述了它参数的特性。在这个例子中,traits是iterator的五个被联合的类型:value_type,reference,pointer,difference_type,和iterator_category.traits模板最重要的特点是它们给我们一个途径,让我们能非侵入地联合一个类型的信息。比如,你的一
7、个同事Hector,给了你一些iterator类型,称为hands_off,它引用到int,你能赋给一个value_type,而且不破坏你们工作组的默契。你所需要做的就是显示的添加一个iterator_traits的专门化,当iter_swap询问Hector的value_type时,iter_swap将看到类型int。关于模板的专门化和实例化,我们将在日后的学习中,进行简但的复习和回顾。namespacestd{template<>structiterator_traits{typedefin
8、tvalue_type;fourmoretypedefs...};}Traits的非侵入性特征是使iterator_traits为指针工作的保障,标准库中包含了下面iterator_traits的专门化,它描述了所有指针的value_
此文档下载收益归作者所有