条款47:请使用traits classes 表现类型信息
2015-09-28 17:57
417 查看
/*条款47:请使用traits classes 表现类型信息*/ //Traits 是一种技术,一个C++程序员共同遵守的协议,它的要求之一是:它对内置类型和用户自定义类型的表现必须一样好 //advance 用来将某个迭代器移动某个给定距离 #include<iostream> using namespace std; template<typename IterT,typename DistT> void advance(IterT &iter,DistT d);//但stl中有不同类型的迭代器,所以操作方法不同,需要对接受的不同类型分别做处理 /* template<typename IterT,typename DistT> void anvance(IterT&iter,DistT d){ if(iter is random access iterator){//处理不同类型的迭代器 iter+=d; } else { if(d>=0){ while(d--) ++iter; } else { while(d++) --iter; } } } // 我们需要取得迭代器类型的某些信息,那就是traits让你得以进行的事,它们允许你在编译期间取得某些类型信息,类取得类型内的嵌套信息在内置类型这里就不行了(因为我们无法将信息嵌套于原始指针内),所以traits信息必须位于类型自身之外,标准技术是把它放进一个template及其一或多个特化版本中,这样的template在标准程序库中有若干个,其中针对迭代器者被命名为iterator_traits: tempalte<typename IterT> struct iterator_traits;// 迭代器分类的相关信息 iterater的动作方式是,针对每一个类型IterT,在struct iterator_traits<IterT>内一定声明某个typedef名为iterator_category,用它来确认迭代器的分类 //例如deque的迭代器可随机访问,所以针对deque迭代器而设计的class看起来像这样 template<..> class deque{ public: class iterator{ public: typedef random_access_iterator_tag iterator_category; //.. } //... }; //list 版本 template<..> class list{ public: class iterator{ public: typedef bidirectional_iterator_tag iterator_category; //.. } //... }; //那么实际的iterator_traits 是这样的 template<typename IterT> struct iterator_traits{ typedef typename IterT::iterator_category iterator_category; //..... //这种方法只对自定义类型有效,那么此类也为指针类型提供了一个偏特化版本如下 : } template<typename IterT> struct iterator_traits<IterT*>{ typedef random_access_iterator_tag iterator_category; //..... }
//然后把各类不同参数的advance 进行重载 tempalte<typename IterT,typename DistT> void doAdvance(IterT&iter,DistT d,std::random_access_iterator_tag){ <span style="white-space:pre"> </span>iter+=d; } tempalte<typename IterT,typename DistT> void doAdvance(IterT&iter,DistT d,std::bidirectional_iterator_tag){ <span style="white-space:pre"> </span>if(d>=0){ <span style="white-space:pre"> </span>while(d++) <span style="white-space:pre"> </span>--iter; <span style="white-space:pre"> </span>} tempalte<typename IterT,typename DistT> void doAdvance(IterT&iter,DistT d,std::input_iterator_tag){ <span style="white-space:pre"> </span>if(d<0){ <span style="white-space:pre"> </span>throw std::out_of_range("Negative distance");<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>while(d--) <span style="white-space:pre"> </span>++iter; */ int main(){ return 0; }
相关文章推荐
- 使用inotifywait同步修改的文件到服务器
- POJ 3714 Raid(求两集合之间的最近点对)
- Debug Assertion Failed! (VS)
- Magento根据客户email强制修改让客户订阅新闻
- #11 LeetCode——Container With Most Water
- UVA 10976 Fractions Again?!
- UVA 253 Cube painting
- HDU 5475 2015 ACM/ICPC Asia Regional Shanghai Online An easy problem(线段树)
- -25299 reason: 'Couldn't add the Keychain Item.'
- 一个很奇特的异常 tmpFile.renameTo(classFile) failed
- adb install失败 - Failure [INSTALL_FAILED_CONTAINER_ERROR]
- Light OJ 1138:Trailing Zeroes (III)【二分+求阶乘中某质因子的幂】
- Aborting commit: 'XXX' remains in conflict错误
- ORA-12641: Authentication service failed to initialize
- maven install Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-wa
- hdu5468(容斥原理)-2015 ACM/ICPC Asia Regional Shanghai Online
- ARC forbids explicit message send of 'retainCount'
- HDU 1022 Train Problem I (STL - 栈的使用)
- does not contain bitcode ShardSDK等三方库
- [个人推荐]理解poll_wait