随笔 - 46  文章 - 39  trackbacks - 0
<2012年3月>
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(2)

随笔分类

随笔档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜


概念和建模(Concepts and Modeling)


任何模板函数的一个非常重要的问题,不仅仅是关于STL算法,而是什么类型集可以正确的替换形式模板参数。很明显,例如,int* 或double*可以替换find函数的形式模板参数InputIterator。同样清楚的是,int或double可能不行:find函数使用表达式*first,和用操作符,从而使int类型对象或double类型对象没意义。那么基本的答案是,发现STL隐式定义了一套类型的需求,它可以满足这些要求的实例。替换InputIterator的任何类型必须提供这些操作:它必须能够比较两个对象是否相等,它必须可以增加该类型的一个对象,它必须可以通过该类型的引用来获得它指向的对象,依次类推。

find函数并不是STL中有这些需求的唯一的算法;for_each函数和count函数,还有其他算法函数的参数也必须要满足这些要求。这些要求相当重要,值得我们给它们一个名字:我们称这种类型集的要求为概念(concept),我们称这个特定的概念为输入迭代器(Input Iterator)。一个类型如果满足了所有这些要求,我们说这个类型符合一个概念,或者说是一个概念模型。我们说int*是一个输入迭代器(Input Iterator)的模型,因为int*提供了输入迭代器的所有要求的操作。

概念不是C++语言的一部分;没有办法在一个程序中定义一个或者申明一个概念模型的特定类型。然而,概念是STL的一个极其重要的组成部分。使用概念(concepts)使得写程序时有可能把接口从实现中清楚地分离:find函数的作者只需要考虑这个接口符合输入迭代器(Input Iterator)概念,而不是去实现每一个可能的类型符合这个概念。同样,如果你想使用find函数,你只需要确保你传递给他的参数是输入迭代(Input Iterator)模型。这就是find函数和reverse函数可以用于lists,vector,C数组,和许多其他类型的原因:概念编程,而不是为特定类型编程,使得它可以重用软件组件和结合这些组件。

下一节 《改进(refinement)》
posted on 2012-02-23 13:41 canaan 阅读(1361) 评论(0)  编辑 收藏 引用 所属分类: 外文翻译

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理