C++泛型编程之类模板
泛型语义
泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意。泛型编
程的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。
泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支
持机制就是模板(Templates)。
模板的精神其实很简单:类型参数化(type parameterized),即,类型也是一种参数,
也是一种静多态。 换句话说, 把一个原本特定于某个类型的算法或类当中的类型信息抽掉,
抽出来做成模板参数。
stack类
Stack 类模板化,可以 push 和 pop 不同的数据类型。主要由几个因素需要把控。栈
中的空间元素类型,压入元素类型,弹出元素类型,三者保持一致即可。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
class Stack{
public:
Stack(int size=1024){
space = new int[size];
top = 0;
}
~Stack(){
delete []space;
}
bool isEmpty(){
return top == 0;
}
bool isFull(){
return top == 1024;
}
void push(int data){
space[top++] = data;
}
int pop(){
return space[--top];
}
private:
int* space;
int top;
};
int main()
{
Stack s(100);
for(int i=0; i<10; ++i){
if(!s.isFull())
s.push(i);
}
while(!s.isEmpty())
cout<<s.pop()<<endl;
return 0;
}
类模板
格式:

应用:
ClassName<int> cn; //类模板->模板类->类对象
Stack类模板
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
template<typename T>class Stack
{
public:
Stack(int size=1024);
~Stack();
bool isEmpty();
bool isFull();
void push(T data);
T pop();
private:
T* space;
int top;
};
template<typename T> Stack<T>::Stack(int size)
{
space = new T[size];
top = 0;
}
template<typename T> Stack<T>::~Stack(){
delete []space;
}
template<typename T>bool Stack<T>::isEmpty(){
return top == 0;
}
template<typename T>bool Stack<T>::isFull(){
return top == 1024;
}
template<typename T>void Stack<T>::push(T data){
space[top++] = data;
}
template<typename T> T Stack<T>::pop(){
return space[--top];
}
int main()
{
Stack<string> s(100);
for(int i=0; i<10; ++i){
if(!s.isFull())
s.push(to_string(i)+"-abc");
}
while(!s.isEmpty())
cout<<s.pop()<<endl;
return 0;
}
类的模板本质上就是函数模板的应用,将抽象化的函数租组织到一个类 模板 内,类名的本质就是一个命名空间。
template<typename T> class XXX从格式上区别于类,完成了对类进行抽象。
类模板的友元
#include <iostream>
#include <istream>
#include <ostream> using namespace std; //类内实现友元
template<typename T>
class Complex
{
friend
istream & operator>> (istream & in, Complex<T>& c)
{
in>>c.real>>c.image;
return in;
}
friend
ostream & operator<< (ostream & out, Complex<T> & c)
{
cout<<"("<<c.real<<","<<c.image<<")"<<endl;
return out;
}
private:
T real;
T image;
};
int main()
{
Complex<double> c;
cin>>c;
cout<<c;
return 0;
}
类外实现友元
1 )类前声明
2 )friend 类中声明 <>
3 )类外实现
#include <iostream>
#include <istream>
#include <ostream>
using namespace std;
//①类前声明
template<typename T> class Complex;
template<typename T> istream & operator>> (istream & in, Complex<T>& c);
template<typename T> ostream & operator<< (ostream & out, Complex<T> & c);
template<typename T>
class Complex
{
//②freind类中声明<>
friend istream & operator>> <>(istream & in, Complex<T>& c);
friend ostream & operator<< <>(ostream & out, Complex<T> & c);
private:
T real;
T image;
};
//③类外实现
template<typename T>
istream & operator>> (istream & in, Complex<T>& c)
{
in>>c.real>>c.image;
return in;
}
template<typename T> ostream & operator<< (ostream & out, Complex<T> & c)
{
cout<<"("<<c.real<<","<<c.image<<")"<<endl;
return out;
}
int main()
{
Complex<double> c;
cin>>c;
cout<<c;
return 0;
}
hpp
《C++编程思想》第 15 章(第 300 页):
模板定义很特殊。由 template<…> 处理的任何东西都意味着编译器在当时不为它分
配存储空间, 它一直处于等待状态直到被一个模板实例告知。 在编译器和连接器的某一处,
有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部
的模板声明和定义,文件后缀为.hpp。
C++泛型编程之类模板的更多相关文章
- c++ 泛型编程及模板学习
泛型编程,英文叫做Generic programming 可以理解为,具有通用意义的.普适性的,编程. 比如,你要实现一个函数去比较两个数值的大小,数值可能是int或者string.初次尝试,我们直观 ...
- 26.C++- 泛型编程之类模板(详解)
在上章25.C++- 泛型编程之函数模板(详解) 学习了后,本章继续来学习类模板 类模板介绍 和函数模板一样,将泛型思想应用于类. 编译器对类模板处理方式和函数模板相同,都是进行2次编译 类模板通 ...
- 25.C++- 泛型编程之函数模板(详解)
本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数和函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int&am ...
- C++ 模板 与 泛型编程
C++ 模板 与 泛型编程 前言 模板有两种:类模板和函数模板 .模板是泛型编程的基础. 什么叫:泛型编程? 使用独立于特定类型的方式进行编程.也就是我们在编程的时候不明确的写上类型,而是使用一个模板 ...
- C/C++程序基础 (十)模板和泛型
什么是泛型编程 基于模板,有效将算法和数据结构分离. 模板 包括类型和参数 模板函数:抽象的函数定义,代表一类同构函数.编译器在其调用位置自动完成对应模板函数的实例化. 模板类:抽象的类定义,代表更高 ...
- Template 基础篇-函数模板(待看
Template 基础篇-函数模板 Template所代表的泛型编程是C++语言中的重要的组成部分,我将通过几篇blog对这半年以来的学习做一个系统的总结,本文是基础篇的第一部分. Template ...
- C++ 模板应用浅析
把曾经写的C++模板的应用心得发表出来. 回忆起当时在学习C++模板时的无助和恐惧,如今还心有余悸.我分享出来我的心得,仅仅希望别人少走弯路,事实上它就这么几种使用方法,不须要害怕. 我总结了模板的四 ...
- C++中函数模板的概念和意义
1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数 模板和类模板就是 C++ 中泛型编程技术,本 ...
- 读书笔记_Effective_C++_条款四十一:了解隐式接口和编译期多态
从本条款开始,就进入了全书的第七部分:模板与泛型编程.模板与泛型在C++中是非常重要的部分,还记得本书第一章时,把C++视为一个联邦,它由四个州政府组成,其中一个政府就是模板与泛型了. 本条款是一个介 ...
随机推荐
- 案例分享:Qt+Arm基于RV1126平台的内窥镜软硬整套解决方案(实时影像、冻结、拍照、录像、背光调整、硬件光源调整,其他产品也可使用该平台,如视频监控,物联网产品等等)
自研产品系列方案 1. 基于瑞芯微的 RV1126 芯片平台: 2. 外接 USB 摄像头(OV9734. OV6946.OV2740 等 UVC 模块)作为图像输入源: 3. 可通过 LED ...
- Appearance-Based Loop Closure Detection for Online Large-Scale and Long-Term Operation
Abstract: 本文提出一种用于大规模的长期回环检测,基于一种内存管理方法:限制用于回环检测的位置数目,以满足实时性要求. introduction: 大场景存在的最关键问题:随着场景增大,回环检 ...
- 微信小程序云开发-云存储-使用云开发控制台存储文件
一.存储 进入[云开发控制台]>点击[存储].将需要存储的文件通过[上传文件]方式上传上去.或者通过拖拽的方式上传文件. 二.存储文件的类型 可以存储的文件有很多,常见的文件类型包括:word ...
- 微信小程序云开发-数据库表创建和操作
一.新建云数据库 进入[云开发]界面,点击[数据库]>添加>创建集合>确定. 二.向数据库中添加数据 选中[数据库],点击[添加记录],向数据库中添加记录 添加[字段]和[值],并选 ...
- 微信小程序云开发-云开发环境配置工作
一.注册小程序 打开[微信开发者工具],点击界面上的[注册],进入注册微信小程序页面.(也可以直接进入微信小程序注册地址:https://mp.weixin.qq.com/进行注册) 进入[小程序注册 ...
- 安装geatpy库到指定的conda虚拟环境中
在Anaconda Prompt中输入conda install geatpy,提示找不到这个库: 输入pip install geatpy,安装成功:但是安装在默认conda环境下(以下为pycha ...
- IBM java开发面试题
1.commite在什么场合使用 svn 提交项目 数据库自动提交 Oracle手动,mysql自动 2.void(0)怎么使用 html界面 <a href="javaScript ...
- 九九乘法表(Java版)
3.九九乘法表 //九九乘法表 public class MultiplicationTables { public static void main(String[] args){ for (int ...
- MP4命令行处理
MP4Box可用于生成符合MPEG-DASH规范的内容,也就是ISO / IEC 23009-1在ISO公共可用标准中可用的内容. dash切片命令: mp4box -dash 5000 -frag ...
- 除了Swagger UI,你还能选择 IGeekFan.AspNetCore.RapiDoc
IGeekFan.AspNetCore.RapiDoc 看到博客园上的这个文章,说了下Knife4J,评论里有人推荐RapiDoc,放了几个图,看了下,还不错. 心里 便有个想法,借着上次研究 Kni ...