ITPub博客

首页 > 应用开发 > IT综合 > boost::concept_check (转)

boost::concept_check (转)

原创 IT综合 作者:worldblog 时间:2007-12-13 10:55:31 0 删除 编辑
boost::concept_check (转)[@more@]

发信人: huxw (米老鸭和唐老鼠), 信区: Programming
标  题: boost::concept_check
发信站: BBS 水木清华站 (Mon May 13 14:21:45 2002)

跟进, 这个比较简单 ;)

boost的概念检查库

一: 为什么

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

  1  #include
  2  #include
  3
  4  int main(int, char*[]) {
  5  std::list v;
  6  std::stable_sort(v.begin(), v.end());
  7  return 0;
  8  }

这个有一个明显的错误, list没有随机存取的叠代子(RandomAccessIterator),
显然不能满足stable_sort的要求.  就是说, 这个程序错了. 但是编译器能告诉
我们吗? 看看他们是怎么说的.

[vc6]
:program filesmicrosoft visual
studiovc98includealgorithm(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::liststd::allocator >::iterator' c:program filesmicrosoft visual
studiovc98includealgorithm(570) : see reference to function
template instantiation 'void __cdecl std::_Insertion_sort_1(class
std::list >::iterator,class
std::list >::iterator,int *)' being
compiled c:program filesmicrosoft visual
studiovc98includealgorithm(579) : error C2676: binary '+' : 'class
std::list >::iterator' does not define
this operator or a conversion to a type acceptable to the predefined
operato r c:program filesmicrosoft visual
studiovc98includealgorithm(570) : see reference to function
template instantiation 'void __cdecl std::_Insertion_sort_1(class
std::list >::iterator,class
std::list >::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 >(_L
....此处略去大约50行
h:1489: no match for `_List_iterator & - _List_iterator &,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 >(_L
....此处略去大约50行
h:1489: no match for `_List_iterator & - _List_iterator &,int *> &'

对于一个初学者来说, 编译器给出的错误信息不但没有说明错误的理由, 而且有
意图要把人的思想往错误的方向上引.  concept_check的作者总结了这样四点:

1. 因为错误的模板参数而导致的编译器错误搞得根密码似的. 经常是错误出在
  模板的调用方, 编译器却扔出模板的内部实现来给程序员看.

2. 作为文档记录下来的concept可能和模板本身的并不完全吻合, 这样就有可能
  出现, 用户明明按着文档的说明来调用模板, 还是出现了莫名其妙的错误

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

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

而concept_check则能够提供:

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

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

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

二. 怎么用

concept的使用很简单了, 就两个东西
[function_requires]
用在一个模板函数的内部. 比如
template
  void generic_library_function(T x)
  {
  function_requires< EqualityComparableConcept >();
  // ...
  };
[BOOST_CLASS_REQUIRES]
用在一个模板类的内部. 比如
  template
  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
 >::constraints()':
D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/boost/concept_c
heck.hpp:43:  instantiated from `boost::function_requiresept<_List_iterator > >()'
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 >::constraints()'
D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/boost/concept_c
heck.hpp:43:  instantiated from `boost::function_requireseratorConcept<_List_iterator > >()'
D:/MINGW/BIN/../lib/gcc-lib/mingw32/2.95.3-5/../../../../include/g++-3/stl_algo.
h:1544:  instantiated from `stable_sort<_List_iterator >(_List
_iterator, _List_iterator)'
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 & < _List_iteratornt,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] 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-992684/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2410538