所谓泛型,从字面上可以猜想,就是泛化的类型(型别、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++标准模板库STL和泛型编程简介 #### 一、STL概述 **STL**(Standard Template Library),即标准模板库,是C++标准库中的一个重要组成部分,它代表了C++语言的一项重大革新。STL的核心理念是将数据结构与算法...
这本书深入探讨了如何利用泛型编程的概念和技术,以及标准模板库(STL)来编写高效、可重用的代码。 泛型编程是一种编程范式,它允许程序员编写不依赖于特定数据类型的代码。这样,同一段代码可以应用于多种类型的...
C++中的STL是通过模板类和函数模板实现的,这使得它具有高度的泛型性,可以用于处理不同类型的元素。STL的主要组件包括容器(containers)、迭代器(iterators)、算法(algorithms)和函数对象(function objects,...
这一思想最终演变成了STL的核心概念——泛型化设计。STL的首次实现是由Stepanov与Meng Lee合作完成的,标志着泛型编程在C++领域的里程碑式发展。 #### 5. STL的关键组件 - **容器(Containers)**:包括向量...
标题“数据结构C2B2B语言描述——应用标准模板库STL第2版源代码”暗示了这个压缩包包含了基于C++(C2B2B可能是指C++的某种特定风格或应用场景)的数据结构实现,特别是使用了STL的第二版设计和实现。源代码通常意味...
首先,容器是STL的基础,它提供了存储和组织数据的结构,如vector(动态数组)、list(双向链表)、set(红黑树)和map(关联数组)。每种容器都有其特定的性能特性和适用场景,例如,vector适合随机访问,而list...
本文将深入探讨泛型编程的基本原理、关键技术和应用场景,以及其在C++标准库中的体现——STL。 #### 模板概念:类型参数化的基石 C++通过引入模板(Template),实现了类型参数化的能力,这是泛型编程的基础。模板...
STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它提供了高效、可重用和泛型的容器、迭代器、算法以及函数对象。本教程和帮助手册旨在深入理解STL的原理和使用方法,通过三...
6. 模板:C++的模板机制使得STL能够实现泛型编程,通过模板可以创建针对不同类型的数据的通用算法和容器。 在实际开发中,理解和熟练运用这些概念,能够帮助你写出更加高效、简洁的C++代码。通过阅读这三本书,你将...
与传统的面向对象编程(OOP)不同,STL更多地依赖于泛型编程的思想,即通过模板来实现通用性和灵活性。 #### 二、STL的关键特性 1. **非面向对象设计**:STL的设计不依赖于面向对象的三大核心特性——封装、继承和...
本篇文章将详细解读标题“STL相关资料:Effective STL”及描述中涉及的三个文档——《Effective STL》、《STL快速入门》和《STL简介》,帮助你深入理解STL的核心概念和最佳实践。 首先,《Effective STL》是Scott ...
C++ STL,全称为Standard Template Library(标准模板库),是C++编程语言中不可或缺的一部分,它为程序员提供了高效且灵活的容器、迭代器、算法和函数对象等工具,极大地提升了代码的可读性和复用性。STL的核心概念...
C++标准模板库(STL)手册详细介绍了C++编程语言中一个非常重要的组成部分——标准模板库(STL)。STL是一种强大的工具,它提供了一组高效的、经过预先优化的、通用的数据结构和算法,可以让程序员无需从零开始编写...
总之,DGL是Delphi开发者的一个强大工具,它通过泛型技术提高了代码的可复用性和安全性,同时提供了丰富的数据结构和算法,使得开发者能够更专注于问题的解决,而非基础数据操作的实现。无论是在大型项目还是小型...
在这个项目中,他与Meng Lee共同开发了一个庞大的库——标准模板库(STL),旨在定义一系列通用算法的同时保证效率。随着时间的发展,STL已经成为国际上广泛接受的一种新的编程范式。 ##### 1.3 STL 和 ANSI/ISO ...
本资料包聚焦于C++中的一个重要概念——泛型编程,并特别关注STL(Standard Template Library,标准模板库)的使用。泛型编程是C++的一个核心特性,它允许程序员编写可重用的代码,这些代码可以处理多种数据类型,...
STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了一系列高效、泛型的容器、迭代器、算法等工具,极大地增强了C++的库功能。在给定的标题和描述中,我们可以看到一个专门...