`
anders0913
  • 浏览: 90673 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

泛型编程

阅读更多
泛型编程

Bjarne: 如果你面对的问题既需要某些运行期决议(需要面向对象编程),又具有一些能够从编译期决议中获益的方面(泛型编程的用武之地)的话,那么你就需要将面向对象编程和泛型编程结合起来。例如,面向对象编程的经典例子 — 将一个保存了shape的容器中的所有元素都显示出来就属于这类问题。几十年前我第一次在Simula中看到过这个例子,后来直到遇到了泛型编程,我才看到它的改进实现。考虑以下代码:

void draw_all(vector<Shape*>& vs)
{
    for (int i=0; i<vs.size(); ++i) vs[i]->draw();
}


我猜想这并不能被看作纯粹的面向对象编程,因为我直接利用了“vs是一个装有Shape*元素的vector”这个事实。毕竟,类型的参数化通常是被认为属于泛型编程的范畴。我们也可以消除这种对静态类型信息的使用(所谓“不纯粹的面向对象编程”):

void draw_all(Object* container)
{
    Vector* v = dynamic_cast<Vector*>(container);
    for (int i=0; i<v.size(); ++i)
    {
        Shape* ps = dynamic_cast<Shape*>(v[i]);
        ps->draw();
    }
} 


但凡鼓励以上这种风格的语言,其语法通常都比较漂亮,然而这个例子却说明了当你把静态类型信息的使用减至最小的时候发生了什么。如今,在C++或其它语言中,仍然有人在使用这种风格。我只是希望他们在错误处理方面有系统化的准备。

在前一个例子中,vector<Shap*>依赖于对泛型编程的一个最简单的运用:vector的元素类型被参数化了,而且我们的示例代码正获益于此。在这个方向上我们还可以走得更远,即推而广之到所有标准库容器身上:

template<class Container> void draw_all(Container& cs)
{
    for (typename C::iterator p=cs.begin(); p!=cs.end(); ++p)
        (*p)->draw();
} 


例如,这段代码就既可以作用于vector上,又可以作用于list上。编译期决议确保我们不用为这种泛化处理付出任何运行期额外代价。我们还可以通过在draw_all()的使用接口中运用迭代器,从而进行进一步的泛化处理:

template<class Iter> void draw_all(Iter fist, Iter last)
{
    for (; first!=last; ++first)
        (*first)->draw();
} 


这就使内建数组类型都得到了支持:

Shape* a[max];
// 向a中填充Shape*类型的元素
draw_all(a,a+max);


我们还可以结合运用标准库算法for_each()和函数适配器mem_fun()来消除显式的循环:

template<class Iter> void draw_all(Iter fist, Iter last)
{
    for_each(first, last, mem_fun(&Shape::draw);
} 


在这些例子中,我们结合了面向对象(对虚函数draw()的调用以及对类继承体系的假设)和泛型编程(参数化的容器和算法)技术。我看不出如果这两种编程风格(即所谓的“范型”)各自独立运用如何达到同样好的效果。这也是一个简单的“多范型编程”的例子。

我认为在设计和编程技术方面,我们还需要做更多的工作,以便确定出“关于何时采用哪种范型以及如何结合运用它们”的更为具体的规则。为此,我们还需要一个比“多范型编程”更好的名字。

注意,这也是一个关于编译错误信息变得可怕的例子,因为我们并没有显式地表达出我们的假设。例如,我们假设容器里的元素类型为Shape*,然而在代码中,这个假设却相当隐晦。这种情况下我们可以使用约束类(此处为Point_to):

template<class Iter> void draw_all(Iter fist, Iter last)
{
    Points_to<Iter,Shape*>();
    for_each(first, last, mem_fun(&Shape::draw);
} 


然而我们又确实很想说明“first和last必须为前向迭代器”:

template<Forward_iterator<Shape*> Iter>
void draw_all(Iter fist, Iter last)
{
    for_each(first, last, mem_fun(&Shape::draw);
} 


这是“concepts”可以大展拳脚的地方之一。

;-)



分享到:
评论

相关推荐

    C++程序设计与实践:11-模板和泛型编程.ppt

    C++程序设计与实践:模板和泛型编程 C++ 程序设计与实践中,模板和泛型编程是非常重要的概念。模板是 C++ 的泛型机制,用来实现泛型编程。泛型编程是指不依赖于任何具体类型来编写通用代码,具体类型信息的提供是在...

    C++设计新思维:泛型编程与设计模式之应用(PDF)

    《C++设计新思维:泛型编程与设计模式之应用》正是这样一本书,它不仅深入探讨了C++的核心理念,还着重强调了泛型编程与设计模式的实际应用,为开发者提供了一个新的视角来审视和掌握这门语言。 泛型编程是C++设计...

    泛型编程([翻译]Java泛型编程指南(上).htm)

    泛型编程 [翻译]Java泛型编程指南(上).htm

    泛型编程源起_实现与意义_下_.pdf

    ### 泛型编程:源起、实现与意义 #### 泛型编程概述 泛型编程是一种编程范式,旨在创建可以处理多种数据类型的算法或数据结构。这种编程方式的核心在于抽象化,即从具体的数据类型中提取出通用的模式或行为,并将...

    侯建的泛型编程与STL

    泛型编程是C++语言中一个强大的特性,它允许开发者编写不依赖于特定数据类型的代码,从而实现更高效、更具可复用性的程序设计。在《侯建的泛型编程与STL》这本书中,作者深入浅出地探讨了这个主题,并将其与C++的...

    泛型编程与伴随.pdf

    ### 泛型编程与伴随知识点解析 #### 一、引言与基础知识 本文档探讨了**泛型编程**中**伴随**概念的应用及其重要性。伴随最初由Daniel Kan在1958年提出,它是**范畴论**中的一个重要概念。在编程领域,尤其是**泛型...

    泛型编程与STLL.rar c++经典书籍

    《泛型编程与STL》是一本深入探讨C++编程技术的专业书籍,主要围绕着泛型编程和标准模板库(STL)展开。泛型编程是C++编程中的一种高级技术,它允许开发者编写可重用且类型无关的代码,提高了代码的灵活性和效率。...

    STL与泛型编程

    泛型编程则是STL的核心思想,它允许我们编写不依赖具体数据类型的代码,从而实现代码的复用性和灵活性。 STL包括四个主要组件:容器、迭代器、函数对象(也称为仿函数)和算法。这些组件共同构建了一个强大的工具箱...

    数学和泛型编程-高效编程的奥秘(英文版pdf)原名:From_Mathematics_to_Generic_Programming

    数学和泛型编程-高效编程的奥秘(英文版pdf)原名:From_Mathematics_to_Generic_Programming,作者;Alexander A. Stepanov Daniel E. Rose

    Cpp设计新思维_泛型编程与设计模式之应用

    《Cpp设计新思维_泛型编程与设计模式之应用》这本书深入探讨了C++编程中的泛型编程和设计模式的应用,对于提升C++开发者的技术水平具有极高的价值。以下是本书涉及的一些关键知识点: 1. 泛型编程:泛型编程是C++中...

    泛型编程与STL——侯捷译

    泛型编程与STL是C++编程领域中的一个重要主题,由知名C++专家侯捷翻译。这本书深入探讨了如何利用泛型编程的概念和技术,以及标准模板库(STL)来编写高效、可重用的代码。 泛型编程是一种编程范式,它允许程序员...

    泛型编程与STL中文版.pdf

    根据提供的信息,“泛型编程与STL中文版.pdf”这一标题和描述中涉及的主要知识点包括泛型编程(Generic Programming)以及标准模板库(Standard Template Library, STL)。由于部分内容并未给出实质性的文本信息,...

    基于Java的泛型编程

    标题和描述均聚焦于“基于Java的泛型编程”,这一主题深入探讨了Java语言中泛型编程的概念、优点以及其实现机制。以下是对这一主题的详细解析,旨在全面阐述泛型编程在Java中的应用及其重要性。 ### 泛型编程的意义...

    泛型编程与STL.pdf

    根据提供的文件信息,“泛型编程与STL.pdf”这一标题及描述主要聚焦于两个核心概念:泛型编程和标准模板库(Standard Template Library,简称STL)。这些是现代C++编程语言中的重要组成部分,对于软件开发人员来说...

    C++设计新思维:泛型编程与设计模式之应用.pdf 带目录书签

    C++设计新思维:泛型编程与设计模式之应用.pdf 带目录书签

    泛型编程与STL.rar

    泛型编程是C++编程中一个重要的概念,它允许开发者编写可重用的代码,这些代码可以处理多种数据类型而不必进行重复的实现。STL(Standard Template Library,标准模板库)是C++的一个核心部分,它利用了泛型编程的...

    深入浅出.NET泛型编程

    ### 深入浅出 .NET 泛型编程 #### 1. 引言 随着 .NET 2.0 的发布,泛型成为了备受瞩目的新特性。泛型的引入解决了早期版本中集合类型(如 `ArrayList`)类型安全方面的问题,并在不牺牲性能的情况下提升了代码的...

Global site tag (gtag.js) - Google Analytics