template模板是c++中支持多态的工具,使用模板可以使用户为类或函数声明一种一般的模式,使得该模板试用于任意类型的参数。

  函数模板

  定义如下:

template <typename T>
void swap(T& a , T& b){
T temp;
temp = a;
a = b;
b = temp;
}

  使用如下:

#include<stdio.h>
int main(){
int num1 = , num2 = ;
swap<int>(num1 , num2);
printf("num1=%d,num2=%d\n",num1,num2);
return ;
}

  类模版:

  如果有两个类,其功能是相同的,仅仅是因为其数据结构不同,就可以通过声明一个类模版,他可以有一个或者多个虚拟的类型参数;这样就能实现“一类多用”。由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。利用类模板可以建立含各种数据类型的类。

  与普通的类相比,类模版主要有下面两处不同:

  1、在声明类模版时要加上template<class T>;

  2、原有所有的类型名如int,都要换成虚拟类型参数名T;

  定义如下:

template<class T>
class Stack{
public:
Stack();
~Stack();
void push(T t);
T pop();
bool isEmpty();
private:
int m_maxSize ;
int m_size ;
T *m_pT ;
} template <class T> Stack<T>::Stack(){
m_maxSize = ;
m_size = ;
m_pT = new T[m_maxSize];
}
template <class T> Stack<T>::~Stack() {
delete [] m_pT ;
} template <class T> void Stack<T>::push(T t) {
m_size++;
m_pT[m_size - ] = t; }
template <class T> T Stack<T>::pop() {
T t = m_pT[m_size - ];
m_size--;
return t;
}
template <class T> bool Stack<T>::isEmpty() {
return m_size == ;
}

  类模版使用:

#inlcude<stdio.h>

int main(){
Stack<int> intStack;
intStack.push();
intStack.push();
intStack.push(); while (!intStack.isEmpty()) {
printf("num:%d\n", intStack.pop());
}
return ;
}

  

  类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如

template <class T1,class T2>

class someclass

{…};

  模版参数:

  模板除了有类型参数,也可以有普通的参数,也可以有默认的模板参数,例如:

template<class T, T def_val>
class Stack{...}

  如果想要对类模版的对象数量进行限制,可是使用int参数来配置这个累的最大对象数,如下:

template <class T,int maxsize = > class Stack {
public:
Stack();
~Stack();
void push(T t);
T pop();
bool isEmpty();
private:
T *m_pT;
int m_maxSize;
int m_size;
}; template <class T,int maxsize> Stack<T, maxsize>::Stack(){
m_maxSize = maxsize;
m_size = ;
m_pT = new T[m_maxSize];
}
template <class T,int maxsize> Stack<T, maxsize>::~Stack() {
delete [] m_pT ;
} template <class T,int maxsize> void Stack<T, maxsize>::push(T t) {
m_size++;
m_pT[m_size - ] = t; }
template <class T,int maxsize> T Stack<T, maxsize>::pop() {
T t = m_pT[m_size - ];
m_size--;
return t;
}
template <class T,int maxsize> bool Stack<T, maxsize>::isEmpty() {
return m_size == ;
}

  使用如下:

#include <stdio.h>
int main() {
int maxsize = ;
Stack<int,> intStack;
for (int i = ; i < maxsize; i++) {
intStack.push(i);
}
while (!intStack.isEmpty()) {
printf("num:%d\n", intStack.pop());
}
return ;
}

template相关的更多相关文章

  1. 微信小程序 template添加点击事件

    介绍template是微信小程序提供的模板,可以在模板中定义代码片段,然后在不同的地方调用. 简单使用定义template因为项目中可能会需要到不止一个template,所以最好新建一个文件夹来存放t ...

  2. WPF之Binding深入探讨

    原文:http://blog.csdn.net/fwj380891124/article/details/8107646 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在 ...

  3. Effective C++ -----条款46:需要类型转换时请为模板定义非成员函数

    当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template内部的friend函数”.

  4. 读书笔记_Effective_C++_条款四十六:需要类型转换时请为模板定义非成员函数

    这个条款可以看成是条款24的续集,我们先简单回顾一下条款24,它说了为什么类似于operator *这样的重载运算符要定义成非成员函数(是为了保证混合乘法2*SomeRational或者SomeRat ...

  5. ansible-1 的安装

    该文章摘自:http://my.oschina.net/firxiao/blog/343395,该文章制作笔记使用,不做他用,转载请注明原文链接出处 Ansible 默认是基于SSH协议进行通信的. ...

  6. Effective C++ 的55个条款

    看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言 ...

  7. flasCC技术点记录

    [待测试特性] 一.C接口导出相关 1.重载函数. 2.虚函数. 3.template相关 二.内存相关 1.as直接往c分配的内存写数据. 2.c直接往as对象写数据. 三.C访问AS 1.访问as ...

  8. WPF的Binding功能解析

    1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...

  9. 强大的代码生成工具MyGeneration

    强大的代码生成工具MyGeneration 转 MyGeneration是一个功能很强大的代码生成工具.通过编写包含各种类型脚本(C#,VB.Net,JScript,VBScript)的模板,通过数据 ...

随机推荐

  1. thinkphp-PHP实现Excel导入 导出功能

    Excel导出 //功能:导出题库模板 public function get_contract_ex() { ob_get_clean(); header("Content-Typ:tex ...

  2. PHP跨域请求nodejs

    摘要:用nodejs作为服务器,php作为客服端进行跨域请求,并返回数据. 一:windows环境下的nodejs安装(以及express模板的安装):http://blog.uifanr.com/2 ...

  3. WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决

    原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...

  4. 01-Flutter移动电商实战-项目学习记录

    一直想系统性的学习一下 Flutter,正好看到该课程<Flutter移动电商实战>的百度云资源,共 69 课时,由于怕自己坚持不下去(经常学着学着就不学了),故采用博客监督以记之. 1. ...

  5. luogu3195 [HNOI2008]玩具装箱TOY

    懒得写 #include <iostream> #include <cstdio> using namespace std; typedef long long longliv ...

  6. Java装箱和拆箱

    https://www.cnblogs.com/dolphin0520/p/3780005.html http://mxdxm.iteye.com/blog/2028196 装箱过程是通过调用包装器的 ...

  7. leetcode 【 Merge k Sorted Lists 】python 实现

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  8. maven学习(一)——maven的下载与安装

    一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...

  9. Eclipse的Web项目完成后怎么发布到Tomcat

    打开eclipse,在“Server Locations”处,可以看到默认的是“Use Workspace metadata”. 而我们选择“Use Tomcat installation”,使用to ...

  10. 普通平衡树(指针splay)

    最早的板子,学自Ez大佬: #include<cstdio> #include<cstdlib> using namespace std; class Splay{ publi ...