快速业务通道

Boost中应用的泛型编程技术

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

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>
OutputIterator
copy(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_t

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号