Boost中应用的泛型编程技术

2016-01-29 12:22 8 1 收藏

Boost中应用的泛型编程技术,Boost中应用的泛型编程技术

【 tulaoshi.com - C语言心得技巧 】

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 OutputIteratorOutputIteratorcopy(InputIterator first, InputIterator last, OutputIterator result){    while (first != last)        *result++ = *first++;    return result;}    

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

#include <list#include <vector#include <iostreamint 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、何谓概念?

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

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

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

3、Traits

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)
template <class Iteratorstruct iterator_traits {    typedef ... iterator_category;    typedef ... val
                        

来源:https://www.tulaoshi.com/n/20160129/1485773.html

延伸阅读
摘 要 :本文简单介绍了Windows环境下进行多线程编程的意义,重点讨论了C++Builder环境下开发多线程应用程序这一问题,并通过实现生产者-消费者问题,帮我们更好地理解同步概念及其实现方法。 关键词 :多线程;同步;生产者-消费者;C++Builder 线程之可行性 在很多情况下,可能需要为程序创建线程。这里给出其中一些可...
最近频繁的接触到泛型方面的问题,所以也不得不来学习一下了,开始主要是在MSDN的WebCast上去下载教学录象看的(李建忠老师的),本篇文章先介绍一下泛型入门方面的知识,希望能让刚开始学习泛型的朋友能够更快的入门,言归正传,首先我们来看一下泛型的基本概念。 最显著的一点就是它参数化了类型,把类型作为参数抽象出来,从而使我们在...
标签: Web开发
级别: 初级 Shantanu Bhattacharya (shantanu@justawordaway.com), 首席顾问, Siemens Information Systems Limited 2006 年 7 月 20 日 函数式或声明性编程是非常强大的编程方法,正逐渐在软件行业流行起来。这篇文章将介绍一些相关的函数式编程概念,并提供有效使用这些概念的示例。作者将解释如何使用 JavaScript(TM)(JavaScript 能导入...
泛型编程-转移构造函数(Generic Programming: Move Constructor) 作者:Andrei Alexandrescu 提交者:eastvc 发布日期:2003-9-20 10:07:17 原文出处:http://www.cuj.com/experts/2102/alexandr.htm 编译:死猫 校对:Wang Tianxing 1 引言 我相信大家很了解,创建、复制和销毁临时对象是C++编译器最爱的户内运动。不幸的是,这些行为...
Java 5 提供泛型支持,泛型支持是开发人员多年以来所要求的特性。它代表了 Java 编程语言一次具有重要意义的升级。像泛型这么复杂的技术,不仅对工具供给商也对开发人员带来了挑战。 !-- frame contents -- !-- /frame contents -- 本文着重介绍 Eclipse 如何应对泛型挑战以及泛型给 Java 语言带来的变化,展示了如何在 Eclipse 中...