王朝网络
分享
 
 
 

boost::concept_check

王朝other·作者佚名  2006-01-08
宽屏版  字体: |||超大  

发信人: huxw (米老鸭和唐老鼠), 信区: Programming

标 题: boost::concept_check

发信站: BBS 水木清华站 (Mon May 13 14:21:45 2002)

跟进, 这个比较简单 ;)

boost的概念检查库

一: 为什么

"概念检查"的意思类似于Design by Contract,我想. 举一个简单的例子,

1 #include <list>

2 #include <algorithm>

3

4 int main(int, char*[]) {

5 std::list<int> v;

6 std::stable_sort(v.begin(), v.end());

7 return 0;

8 }

这个有一个明显的错误, list没有随机存取的叠代子(RandomAccessIterator),

显然不能满足stable_sort的要求. 就是说, 这个程序错了. 但是编译器能告诉

我们吗? 看看他们是怎么说的.

[vc6]

:\program files\microsoft visual

studio\vc98\include\algorithm(579) : error C2784: 'class

std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator

+(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could

not deduce template arg ument for '' from 'class std::list<int,class

std::allocator<int> >::iterator' c:\program files\microsoft visual

studio\vc98\include\algorithm(570) : see reference to function

template instantiation 'void __cdecl std::_Insertion_sort_1(class

std::list<int,class std::allocator<int> >::iterator,class

std::list<int,class std::allocator<int> >::iterator,int *)' being

compiled c:\program files\microsoft visual

studio\vc98\include\algorithm(579) : error C2676: binary '+' : 'class

std::list<int,class std::allocator<int> >::iterator' does not define

this operator or a conversion to a type acceptable to the predefined

operato r c:\program files\microsoft visual

studio\vc98\include\algorithm(570) : see reference to function

template instantiation 'void __cdecl std::_Insertion_sort_1(class

std::list<int,class std::allocator<int> >::iterator,class

std::list<int,class std::allocator<int> >::iterator,int *)' being

compiled

[g++ 2.95.3]

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/g++-3/stl_algo

h: In function `void __inplace_stable_sort<_List_iterator<int,int &,int *> >(_L

....此处略去大约50行

h:1489: no match for `_List_iterator<int,int &,int *> & - _List_iterator<int,in

&,int *> &'

对于一个初学者来说, 编译器给出的错误信息不但没有说明错误的理由, 而且有

意图要把人的思想往错误的方向上引. concept_check的作者总结了这样四点:

1. 因为错误的模板参数而导致的编译器错误搞得根密码似的. 经常是错误出在

模板的调用方, 编译器却扔出模板的内部实现来给程序员看.

2. 作为文档记录下来的concept可能和模板本身的并不完全吻合, 这样就有可能

出现, 用户明明按着文档的说明来调用模板, 还是出现了莫名其妙的错误

3. 文档化的concept过于束缚, 超过了模板真正需要的.

4. concept并没有表现在代码中, 这使得代码难于理解; 而且代码和文档难于同步.

compiled

[g++ 2.95.3]

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/g++-3/stl_algo

h: In function `void __inplace_stable_sort<_List_iterator<int,int &,int *> >(_L

....此处略去大约50行

h:1489: no match for `_List_iterator<int,int &,int *> & - _List_iterator<int,in

&,int *> &'

对于一个初学者来说, 编译器给出的错误信息不但没有说明错误的理由, 而且有

意图要把人的思想往错误的方向上引. concept_check的作者总结了这样四点:

1. 因为错误的模板参数而导致的编译器错误搞得根密码似的. 经常是错误出在

模板的调用方, 编译器却扔出模板的内部实现来给程序员看.

2. 作为文档记录下来的concept可能和模板本身的并不完全吻合, 这样就有可能

出现, 用户明明按着文档的说明来调用模板, 还是出现了莫名其妙的错误

3. 文档化的concept过于束缚, 超过了模板真正需要的.

4. concept并没有表现在代码中, 这使得代码难于理解; 而且代码和文档难于同步.

而concept_check则能够提供:

1. 插入的编译期模板参数检查

2. 通过concept checking类来建立一个能够明确表示concept要求的框架(framework)

3. 能够校验模板参数的机制

二. 怎么用

concept的使用很简单了, 就两个东西

[function_requires]

用在一个模板函数的内部. 比如

template <class T>

void generic_library_function(T x)

{

function_requires< EqualityComparableConcept<T> >();

// ...

};

[BOOST_CLASS_REQUIRES]

用在一个模板类的内部. 比如

template <class T>

struct generic_library_class

{

BOOST_CLASS_REQUIRES(T, EqualityComparableConcept);

// ...

};

在一个刚才的例子, 如果我们修改了algorithm中的stable_sort代码,那么...

输出的结果应该是酱紫的:

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/boost/concept_c

heck.hpp: In method `void boost::ComparableConcept<_List_iterator<int,int &,int*>

>::constraints()':

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/boost/concept_c

heck.hpp:43: instantiated from `boost::function_requires<boost::ComparableConc

ept<_List_iterator<int,int &,int *> > >()'

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/boost/concept_c

heck.hpp:607: instantiated from `boost::RandomAccessIteratorConcept<_List_iter

ator<int,int &,int *> >::constraints()'

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/boost/concept_c

heck.hpp:43: instantiated from `boost::function_requires<boost::RandomAccessIt

eratorConcept<_List_iterator<int,int &,int *> > >()'

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/g++-3/stl_algo.

h:1544: instantiated from `stable_sort<_List_iterator<int,int &,int *> >(_List

_iterator<int,int &,int *>, _List_iterator<int,int &,int *>)'

qq.cpp:6: instantiated from here

D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/boost/concept_c

heck.hpp:282: no match for `_List_iterator<int,int &,int *> & < _List_iterator<i

nt,int &,int *> &'

... 一下略去

这里至少出现了RandomAccessIteratorConcept, qq.cpp:6这样的关键字. 而且

concept_check这样的字眼也在提醒程序员, 错误出现的原因在你自己而不是

库. 错误信息还是很长很长, 虽然比原来要短一点了. ;(

三. 实现于扩展

concept类实现的规范很简单, 必须有一个void constraints()的非静态成员函

数, 这是给function_requires回掉用的. 而且, 最好顺便给你的类名加上一个

Concept的后缀, 这能够说明这个类是干什么的.

四. 其他

最好能够看看concept_check.hpp文件, 代码并不复杂, BOOST_CLASS_REQUIRES

这里至少出现了RandomAccessIteratorConcept, qq.cpp:6这样的关键字. 而且

concept_check这样的字眼也在提醒程序员, 错误出现的原因在你自己而不是

库. 错误信息还是很长很长, 虽然比原来要短一点了. ;(

三. 实现于扩展

concept类实现的规范很简单, 必须有一个void constraints()的非静态成员函

数, 这是给function_requires回掉用的. 而且, 最好顺便给你的类名加上一个

Concept的后缀, 这能够说明这个类是干什么的.

四. 其他

最好能够看看concept_check.hpp文件, 代码并不复杂, BOOST_CLASS_REQUIRES

是一个用来拼装函数的宏.

--

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

※ 来源:·BBS 水木清华站 bbs.edu.cn·[FROM: 166.111.64.166]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有