我们现在要计算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. 调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type

    调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type 解决方法1: 原因是Spring中的cglib-nodep-2.x.x.jar与Hibernate中 ...

  2. window.top.location

    window.top.location的作用 top, 表示是顶层页面, 因为页面之中可能嵌入了 frame 等子页面,top表示最外面一层 Html代码 <html>   <hea ...

  3. 连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    当用到自增序列,需要用到触发器的时候,当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误. ---.应用信息 drop table app_info cascade constraints ...

  4. css3中做3D导航栏

    看别人做的一个3D导航栏,觉得很厉害,这里先保存下来,后面有时间好好分析一下: <!doctype html> <html lang="en"> <h ...

  5. PHP 判断手机号归属地 和 运营商的免费接口

    在项目开发的时候,需要去查询又一批手机号或者固话的具体信息(归属地 运营商) 就需要写一个脚本,来批量请求接口来得到我们想要的数据 学习源头:https://blog.csdn.net/shaerdo ...

  6. Mac电脑Tomcat下载及安装(详细)

    下载Tomcat 1.打开Apache Tomcat官网,选择你需要的版本进行下载: 地址http://tomcat.apache.org/download-70.cgi   2.解压apache-t ...

  7. 关于object-c类目的理解

    类目:为已知的类增加新的方法: 一.类目: 1. 类目方法的应用: 对现有类进行扩展:比如:可以扩展Cocoa touch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别. ...

  8. springboot成神之——发送邮件

    本文介绍如何用spring发送邮件 目录结构 依赖 MailConfig TestController 测试 本文介绍如何用spring发送邮件 目录结构 依赖 <dependency> ...

  9. mysql int类型范围

    int范围 Type Bytes Minimum Value Maximum Value     (Signed/Unsigned) (Signed/Unsigned) TINYINT 1 -128 ...

  10. Valid timeZone Values(转)

    https://www.vmware.com/support/developer/vc-sdk/visdk400pubs/ReferenceGuide/timezone.html Valid time ...