`

模板——泛型和STL的基础

阅读更多

        所谓泛型,从字面上可以猜想,就是泛化的类型(型别、type)。那么是在什么时候,类型被泛化了呢?我们知道,在编写一个函数的时候,通常都会知道参数(parameter)是什么类型的,很多时候这是理所当然的事情,连类型都不知道,怎么对传入参数进行操作呢?面对这样类似的疑问,C++总会展露出她迷人的笑容,让人消魂。这次,她用温柔的声线告诉我:“我可是能实现可以接受任何适当类型参数的函数哦。
        不会吧,我可没有用Java写过这样的函数哦。嘿嘿,偶还没有勇气去养“老虎”,所以只能这样大惊小怪了。
        其实,我们是可以理解语言支持泛型的,如果为了针对不同的类型去实现相同的行为就要去将代码重复再重复,就真的太笨了,代码重复也正是代码坏味道的一种。在Java中,如ArrayList,Vector都是使用对象数组(Object[])来储存数据的,也就是说这些Collection是基于基础类型(base type)而实现,这样才能使得这个Collection具有通用性,即使如此,ArrayList和Vector也不能存储基本类型(primitive type),因为对象数组的元素根本就不能是int、double这样的基本类型,这样类型是不匹配的。除了这个缺点之外,由于实现这些Collection是基于基础类型的,因此编译器无法进行类型检查,同时也就没有办法进行Collection元素之间关系的处理了。举个简单例子,即使一个ArrayList只是装了Integer类型的数据,编译器都没有办法知道,同时也没有办法直接对这个ArrayList进行操作,从中找出最大值。这就是缺少范型支持的一个大缺陷了。泛型如此重要,而模板函数正是实现泛型函数的基础。

        重温C++的旧梦,我是从标准库开始的,在标准库中,处处都能看到template关键字的身影。Almost all parts of the library are written as templates. Without template support, you can't use the standard library. [1]
        看来还是从最根本的开始了——Template(模板)。在这里,我主要将注意力集中在模板函数上。以下是一个最简单的模板函数:

template <class T> 
inline T 
const& max (T const& a, T const& b) 

    
return a < b ? b : a; 
}
  

        我们在调用模板函数的时候跟调用一般的函数是没有什么区别的:

#include <iostream>
#include 
<string>
#include 
<vector>
#include 
"max.hpp"

int main() {
    
int i = 42
    std::cout 
<< "max(7,i): " << max(7,i) << std::endl; 

    
double f1 = 3.4
    
double f2 = -6.7
    std::cout 
<< "max(f1,f2): " << max(f1,f2) << std::endl; 

    std::
string s1 = "mathematics"
    std::
string s2 = "math"
    std::cout 
<< "max(s1,s2): " << ::max(s1,s2) << std::endl; 
}

        模板函数之所以能够接受任何类型的参数,其实是在编译的过程中,根据模板使用的情况编译成相应的一般的函数去处理这些不同的参数。譬如例子中有三次调用,就会将模板函数编译成三种版本以处理这三种不同类型的参数了。对于第一个调用max( 7, i ),就是使用了将模板函数中的T替换成int的版本,这也说明了如果这样调用是会无法通过编译的:max ( 7,  3.4 )。
        除此之外,所谓能够接受任何类型的参数,其实也是有限制的。譬如说,max函数中的"<"操作父约束了参数a和b的类型,至少这两个参数能够支持这样的操作才是合法的。

        [1] C++ Standard Library, The: A Tutorial and Reference

分享到:
评论

相关推荐

    C++ 泛型编程详解

    这一篇介绍一下 C++ 编程中与面向对象并列的另一大分支——泛型编程,这一篇主要介绍函数模板、类模板和成员模板三大部分 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 泛型编程 模板是泛型编程的一种重要...

    C++标准的STL介绍

    为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,...

    推荐的C++书籍 4.4 STL源码剖析

    并且,在这里要明确的是&lt;&lt;modern c++ design&gt;&gt;并不是一本泛型编成的书,也不是一本模板手册。其中提出了基于策略的设计方法,有计划和目的的使用了模板、面向对象和设计模式。虽然Andrei本人对模板的研究世界无人能...

    STL源码剖析

    标准模板库设计人Stepanov早期从事教育工作,1970年代研究泛型程序设计,那时他与其同事一起在GE公司开发出一个新的程序语言——Tecton。 1983年,Stepanov先生转至Polytechnic大学教书,继续研究泛型程序设计,同时...

    推荐的C++书籍 4.3 Generic programming and the STL

    并且,在这里要明确的是&lt;&lt;modern c++ design&gt;&gt;并不是一本泛型编成的书,也不是一本模板手册。其中提出了基于策略的设计方法,有计划和目的的使用了模板、面向对象和设计模式。虽然Andrei本人对模板的研究世界无人能...

    C++书籍集合

    本书阐述了泛型程序设计的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并为你展示这些观念如何导出STL的基础概念:iterators(迭代器)、containers(容器)和function objects(函数对象...

    摩托罗拉C++面试题

    模板可以说比较古老了,但是当前的泛型编程实质上就是模板编程。 它体现了一种通用和泛化的思想。 STL有7种主要容器:vector,list,deque,map,multimap,set,multiset. 17.你如何理解MVC。简单举例来说明其应用。 ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·使用visual c++ 2010支持的两种c++语言技术讲述c++编程的基础知识  ·分享c++程序的错误查找技术,并介绍通用的调试原则讨论每一个windows应用程序的结构和基本元素  ·举例说明如何使用mfc开发本地windows...

    编程新手真言......

    ———— A Programming Introduction For Beginners By Minlearn @ http://www.actyou.com.cn/ 设计才是真正的编程! 对类型的设计才是设计! 面向对象并非一切? 无论你以为上述观点是惊天大秘或不过尔尔,你...

    C++标准库介绍.pdf

    为全世界范围内数千种成功应用基础Qt也是流行Linux桌面环境KDE 基础同时它还支持Windows、Macosh、 Unix/X11等多种平台 3、WxWindows 参考网站WebSite:http://www.wxwindows.org  跨平台GUI库其类层次极像MFC所以有...

Global site tag (gtag.js) - Google Analytics