Boost中应用的泛型编程技术

861191371

861191371

2016-01-29 12:22

Boost中应用的泛型编程技术,Boost中应用的泛型编程技术
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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)1、何谓泛型编程

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

作为泛型编程的一个简单例子,让我们看一下在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、何谓概念?

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

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

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

3、Traits

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

template <class Iteratorstruct iterator_traits {    typedef ... iterator_category;    typedef ... val      
展开更多 50%)
分享

猜你喜欢

Boost中应用的泛型编程技术

C语言教程 C语言函数
Boost中应用的泛型编程技术

Java 编程技术中汉字问题的分析及解决

编程语言 网络编程
Java 编程技术中汉字问题的分析及解决

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java泛型编程快速入门

编程语言 网络编程
Java泛型编程快速入门

Java语言编程技术中汉字问题的分析及解决

编程语言 网络编程
Java语言编程技术中汉字问题的分析及解决

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Delphi下的COM编程技术简介

Delphi
Delphi下的COM编程技术简介

如何在SQL Server开发中融入极限编程技术

SQLServer
如何在SQL Server开发中融入极限编程技术

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《讨鬼传 极》攻锁镰配魂推荐与讨伐建速水视频

《讨鬼传 极》攻锁镰配魂推荐与讨伐建速水视频

基本配色——活力

基本配色——活力
下拉加载更多内容 ↓