我们现在要计算int和double类型数据的平方,我们就需要2个函数:

#include <iostream>
using namespace std; int square(int x) {
return x*x;
} double square(double x) {
return x*x;
} int main() {
cout << square() << endl;
cout << square(5.5) << endl;
system("pause");
}

我们完成了任务,但是是用一种非常不方便的方式,如果还要计算long long和float类型的数据平方,我们还需要添加2个函数。

这就是我们为什么需要template。使用template我们只需要1个函数,就能完成所有任务。

#include <iostream>
using namespace std; template <class T>
T square(T x) {
return x*x;
} int main() {
cout << square<int>() << endl;
cout << square<double>(5.5) << endl;
system("pause");
}

注意:在使用template function时候,我们不必明确指示参数类型,编译器能根据函数的参数自动判断类型。 所以 square(5)和square(5.5)也是正确的写法。

1.template有一个负面效果:code bloat(代码膨胀)

即使我们只有一个template方法。但是由于square(5)和square(5.5)参数类型不一样,在最终的代码中有2个不同的square函数。如果你使用了很多不同类型参数的

square函数,最终的代码size,就会比较大。

下面我们来介绍模版类:class template。

template除了可以用在函数上,也可以在类中使用。编写一个简单的MyVector类。

#include <iostream>
using namespace std; template <class T>
class MyVector{
int size;
T arr[];
public:
MyVector() : size () { }
void push(T x) {
arr[size] = x;
size++;
}
void print() const {
for(int i=; i<size; i++)
cout << arr[i] << endl;
}
}; /* 在类外部实现函数的写法。
template <class T>
void MyVector<T>::push(T x) {
arr[size] = x;
size++;
}
*/ int main() {
MyVector<int> My;
My.push();
My.push();
My.push();
My.push();
My.print();
system("pause");
}

2.不同于模板函数,模版类你必须明确指定类型。

现在我们希望square函数能够作用与MyVector类。 思考:

1.square函数是2个相同类型的相乘,所以我们要重载MyVector类的 *操作符。它的参数是两个MyVector类,返回值是一个新的MyVector类。

所以函数原型如下:

template <class T>

MyVector<T> operator *(const MyVector<T> v1, const MyVector<T> v2)

2.因为square函数是自己乘自己。所以size一定是相同的。

获取size: int getSize() const

获取每个位置的值 T get(int i) const

然后我们把每个位置的值相乘,返回值放在一个新的MyVector中,返回新的MyVector就完成任务。

#include <iostream>
using namespace std; template <class T>
T square(T x) {
return x*x;
} template <class T>
class MyVector{
int size;
T arr[];
public:
MyVector() : size () { }
void push(T x) {
arr[size] = x;
size++;
}
void print() const {
for(int i=; i<size; i++)
cout << arr[i] << endl;
}
int getSize() const { return size; }
T get(int i) const { return arr[i]; }
}; template <class T>
MyVector<T> operator *(const MyVector<T> &v1, MyVector<T> &v2) {
MyVector<T> ret;
int size = v1.getSize();
for(int i=; i<size; i++) {
T x = v1.get(i) * v2.get(i);
ret.push(x);
}
return ret;
} int main() {
MyVector<int> My;
My.push();
My.push();
My.push();
My.push();
My.print();
cout << "After square" << endl;
MyVector<int> NewVector;
NewVector = square(My);
NewVector.print();
system("pause");
}

1.介绍templates的更多相关文章

  1. Nagios配置和命令介绍(二 )

    Nagios配置 Nagios 主要用于监控一台或者多台本地主机及远程的各种信息,包括本机资源及对外的服务等.默认的Nagios 配置没有任何监控内容,仅是一些模板文件.若要让Nagios 提供服务, ...

  2. Django入门与实战

    第1章 介绍课程目标及学习内容 1-1 课程介绍: 第2章 课前准备 2-1 课前准备: 第3章 开发环境搭建 3-1 开发环境搭建: 第4章 创建项目及应用 4-1 创建项目,并了解项目目录下的部分 ...

  3. Django开发简单博客流程

    什么是Django? Django是一个基于python的高级web开发框架 它能够让开发人员进行高效且快速的开发 高度集成(不用自己造轮子), 免费并且开源 当前路径创建工程 django-admi ...

  4. Django 笔记2018.2.7

    1.基础知识 1.1web服务基本原理 1.2 WSGI 目前最通用的web接口规范,python默认支持,在Django中是一个库 1.3WEB基础知识 MTV (Model Template Vi ...

  5. Blitz Templates介绍

    Blitz Templates Blitz Templates-应用于大型互联网项目的非常强大非常快的模板引擎.   下载: sourceforge, 源代码 主页, win32 二进制文件, 其他语 ...

  6. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

  7. [c++] Templates

    Template是编译时多态.所有的模板都是在编译时产生对应的代码,它没有面向对象中的虚表,无法实现动态多态. Function Template A function template is a p ...

  8. 微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验

    早在今年的BUILD大会上,诺基亚就宣布了SensorCore以及它的部分演示.今天,它终于面世了,大家可以去Building Apps for Windows 上查看具体介绍,或者也可以去Nokia ...

  9. Myeclipse Templates详解(一) —— Java模板基础

    目录 Templates简介 MyEclipse自带Templates详解 新建Template 自定义Template 因为自己比较懒,尤其是对敲重复代码比较厌恶,所以经常喜欢用快捷键和模板,Mye ...

随机推荐

  1. rpm -Uvh 升级时的陷阱

    问题现象 用rpm -Uvh升级后,原先的一个软链接被删除了,而采用先rpm -e 卸载rpm包,再rpm -ivh 安装包的方法,这个软链接还在.这个软链接是在rpm包安装的时候建立,也只有在rpm ...

  2. ORA-00845 : MEMORY_TARGET not supported on this system(调大数据库内存无法启动)

    问题描述:调大数据库内存后,启动数据库报 ORA-00845 : MEMORY_TARGET not supported on this system . -- 调大数据库内存后,数据库启动报错[ro ...

  3. 浅谈对【OSI七层协议】的理解

    我们每天都在上网冲浪,在这背后到底有那些设备.协议去支撑呢?ISO是[Open System Interconnection]的缩写,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本 ...

  4. Python中if __name__ == 'main' 的作用和原理

    参考网址:http://mp.weixin.qq.com/s/kxxhOQ7KB_VMwWeUENX7OQ t1.py: print('Loving Python') def main(): prin ...

  5. maven环境配置详解,及maven项目的搭建及maven项目聚合

    首先:Maven 3.2.1:不同版本中仓库中文件是不一样的,Maven运行,先找用户配置,再找全局配置 1. Maven全局配置:全局统一的配置文件,在maven的安装目录中 2. Maven用户配 ...

  6. Linux:远程连接 SSH

    一.认识 SSH 定义 SSH(Secure shell):安全外壳协议:是建立在应用层基础上的安全协议: 通过 SSH 进行服务端连接,不容易被窃取信息: 连接服务器 ssh 服务器名 + @ + ...

  7. random类类型

    random r=new random(): int shu=r.next(3):非负数

  8. Spring缓存源码剖析:(一)工具选择

    从本篇开始对Spring 4.3.6版本中Cache部分做一次深度剖析.剖析过程中会对其中使用到的设计模式以及原则进行分析.相信对设计内功修炼必定大有好处. 一.环境及工具 IntelliJ IDEA ...

  9. Android的按钮单击事件及监听器的实现方式

    第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式 的事件监听器更合适 ...

  10. verilog 建模笔记--低级建模

    来源  <verilog HDL那些事--建模篇> 1.并行建模的思想. 2.每个模块最好只有一个功能.(便于修改和扩展,特别在大的项目中) 典型的 HDL 教科书中,才不会要读者了解“模 ...