概念和建模(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 阅读(1360)
评论(0) 编辑 收藏 引用 所属分类:
外文翻译