当前位置: 首页 > 图文教程 > 开发语言 > VC++ > Boost中应用的泛型编程技术

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 Boost中应用的泛型编程技术


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 137 ::
收藏到网摘: n/a

Boost中应用的泛型编程技术
作者:David Abrahams

提交者:eastvc 发布日期:2003-9-20 10:16:13
原文出处:http://www.cpphelp.net/issue/gpt.html


译者:Merlin Ran
英文原文:http://www.boost.org/more/generic_programming.html

1、何谓泛型编程

泛型编程(Generic Programming)关注于产生通用的软件组件,让这些组件在不同的应用场合都能很容易地重用。在C++中,类模板和函数模板是进行泛型编程极为有效的机制。有了这两大利器,我们在实现泛型化的同时,并不需要付出效率的代价。

作为泛型编程的一个简单例子,让我们看一下在C库中如何让memcpy()函数泛型化。一种实现方法可能是这样的:

void* memcpy(void* region1, const void* region2, size_t n){ const char* first = (const char*)region2; const char* last = ((const char*)region2) + n; char* result = (char*)region1; while (first != last) *result++ = *first++; return result;} 

这个memcpy()函数已经在一定程度上进行了泛型化,采取的措施是使用void*,这样该函数就可以拷贝不同类型的数组。但如果我们想拷贝的数据不是放在数组里,而是由链表来存放呢?我们能不能扩展这个概念,让它可以拷贝任意的序列?看看memcpy()的函数体,这个函数对传入的序列有一个_最小需求_:它需要用某种形式的指针来遍历这个序列;访问指针正指向的元素;把元素写到目的地;比较指针以判断何时停止拷贝。C++标准库把这样的需求进行分组,称之为概念(concepts)。在这个例子中就有输入迭代器(对应于region1)和输出迭代器(对应于region2)这两个概念。

如果我们把memcpy()用函数模板重写,使用输入迭代器和输出迭代器作为模板参数来描述对序列的需求,我们就可以写出一个具有较高重用性的copy()函数:

template <typename InputIterator, typename OutputIterator>OutputIteratorcopy(InputIterator first, InputIterator last, OutputIterator result){ while (first != last) *result++ = *first++; return result;} 

使用这个泛型的copy()函数,我们可以拷贝各种各样的序列,只要它满足了我们指定的需求。对外提供了迭代器的链表,比如std::list,也可以通过我们的copy()函数来拷贝:

#include <list>#include <vector>#include <iostream>int main(){ const int N = 3; std::vector<int> region1(N); std::list<int> region2; region2.push_back(1); region2.push_back(0); region2.push_back(3); std::copy(region2.begin(), region2.end(), region1.begin()); for (int i = 0; i < N; ++i) std::cout << region1[i] << " "; std::cout << std::endl;} 

2、何谓概念?

概念就是需求的集合,这些需求可以包含有效表达式、相关类型、不变性,以及复杂度保证。满足概念中所有需求的类型,称之为此概念的一个样例。一个概念可以是对别的概念的扩展,称之为概念的细化。

  • 有效表达式:任意的C++表达式。若某类型是概念的一个样例,那么把该类型的一个对象代入此表达式中,该表达式必能通过编译。
  • 相关类型:与样例相关的一些类型,它们和样例共同出现在一个或多个有效表达式中。如果样例类型是自定义类型,则相关类型可以由类定义中所嵌套的一些typedef来访问。相关类型经常也通过traits类来访问。
  • 不变性:对象的一些运行时特征,必须为真。所有用到这个对象的函数,都必须保持这种特征。不变性通常以前置条件和后置条件的形式出现。
  • 复杂度保证:对概念中的有效表达式执行所需时间或资源所做的限制。

C++标准库中所使用的概念在SGI STL网站上有详细的文档说明。

3、Traits

traits类为访问编译时实体(类型、整数常量,或者地址)的相关信息提供了一条途径。比如,类模板std::iterator_traits<T>看起来是这个样子:

template <class Iterator>struct iterator_traits { typedef ... iterator_category; typedef ... val