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

VC++
几个数字信号处理算法程序
简易软盘镜像工具的实现及操作系统编写初步
教你使用正则表达式
C++ 扩展和嵌入 Python
拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性
精通VC与Matlab联合编程(六)
精通VC与Matlab联合编程(五)
一个排序用的C++函数模板
浅析VC与MATLAB联合编程
C++编译器如何实现异常处理
文件重定义冲突的分析与解决
一步一步实现MFC扩展DLL中导出类和对话框
C宏:智者的利刃,愚者的恶梦!
引用的作用
《UTF-8与GB2312之间的互换》的改进
程序风格的要素-C++风格指南
VC+6.0实现文本串的自由拆分
怎样给串行化类分配版本号(可配置版本模式)
在常规的编程任务中使用新的 <tuple> 库
使用 typedef 抑制劣质代码

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 133 ::
收藏到网摘: 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