我们现在要计算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. PADS Logic 脚本的 Fields 一个对象记录

    PADS Logic 脚本的 Fields 一个对象记录 PADS Laogic 有一个非常棒的脚本功能,可以导出所以元件. 我目前是把脚本绑定到 Ctrl+S 上,在保存时自动导出 txt 文件,方 ...

  2. 从ROS bag文件中提取图像

    从ROS bag文件中提取图像 创建launch文件,如下: export.launch <launch> <node pkg="rosbag" type=&qu ...

  3. .com .cn .org .edu等域名的意义

    在开发的时候遇到了.org的域名,后来就去查了一下,原来这种域名是非盈利组织或者协会的标志 比如: https://getcomposer.org/ https://packagist.org/ ht ...

  4. MongoDB Data Model 浅谈

    MongoDB 对于数据的 schema 要求很灵活. 与 MySQL 相比,collection 并不会强制文档的结构.(MySQL 在定义表时, 需要指定有哪些字段.类型.展示长度等) 因此,插入 ...

  5. mysql事务之二:MySQL隔离级别演示

    登录mysql: mysql -u root -p123456 Mysql 版本号 mysql> select version(); +-------------------------+ | ...

  6. ES之四、Elasticsearch集群和索引常用命令

    REST API用途 elasticsearch支持多种通讯,其中包括http请求响应服务,因此通过curl命令,可以发送http请求,并得到json返回内容. ES提供了很多全面的API,常用的RE ...

  7. codeforces 985E Pencils and Boxes(dp+思维)

    E. Pencils and Boxes time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. Java中计算对象的大小

    一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...

  9. 静态实现AOP(翻译自MSDN)

    在.net实现AOP 本文通过一个简单的例子实现静态AOP.改例子主要实现客户的增删改查,突然有一天你的老板需要在程序上跟踪每个方法操作的运行日志. 主要分为5个步骤. 第一步:创建接口IReposi ...

  10. AJAX的流程是什么?

    客户端产生js的事件 创建XMLHttpRequest对象 对XMLHttpRequest进行配置 通过AJAX引擎发送异步请求 服务器端接受请求并且处理请求,返回html或者xml内容 XML调用一 ...