1.介绍templates
我们现在要计算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的更多相关文章
- Nagios配置和命令介绍(二 )
Nagios配置 Nagios 主要用于监控一台或者多台本地主机及远程的各种信息,包括本机资源及对外的服务等.默认的Nagios 配置没有任何监控内容,仅是一些模板文件.若要让Nagios 提供服务, ...
- Django入门与实战
第1章 介绍课程目标及学习内容 1-1 课程介绍: 第2章 课前准备 2-1 课前准备: 第3章 开发环境搭建 3-1 开发环境搭建: 第4章 创建项目及应用 4-1 创建项目,并了解项目目录下的部分 ...
- Django开发简单博客流程
什么是Django? Django是一个基于python的高级web开发框架 它能够让开发人员进行高效且快速的开发 高度集成(不用自己造轮子), 免费并且开源 当前路径创建工程 django-admi ...
- Django 笔记2018.2.7
1.基础知识 1.1web服务基本原理 1.2 WSGI 目前最通用的web接口规范,python默认支持,在Django中是一个库 1.3WEB基础知识 MTV (Model Template Vi ...
- Blitz Templates介绍
Blitz Templates Blitz Templates-应用于大型互联网项目的非常强大非常快的模板引擎. 下载: sourceforge, 源代码 主页, win32 二进制文件, 其他语 ...
- DotNet Core 介绍
前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...
- [c++] Templates
Template是编译时多态.所有的模板都是在编译时产生对应的代码,它没有面向对象中的虚表,无法实现动态多态. Function Template A function template is a p ...
- 微软移动 Nokia Lumia SensorCore SDK 介绍及上手体验
早在今年的BUILD大会上,诺基亚就宣布了SensorCore以及它的部分演示.今天,它终于面世了,大家可以去Building Apps for Windows 上查看具体介绍,或者也可以去Nokia ...
- Myeclipse Templates详解(一) —— Java模板基础
目录 Templates简介 MyEclipse自带Templates详解 新建Template 自定义Template 因为自己比较懒,尤其是对敲重复代码比较厌恶,所以经常喜欢用快捷键和模板,Mye ...
随机推荐
- BZOJ3632: 外太空旅行
BZOJ1547: 周末晚会 https://lydsy.com/JudgeOnline/problem.php?id=1547 分析: 对于一个串旋转若干次会回到本身,旋转次数即是同构个数,这个东西 ...
- UIImage+PYJColorBecomeImage
UIImage+PYJColorBecomeImage.h: // // UIImage+PYJColorBecomeImage.h // 颜色转成图片 // // Created by PengYu ...
- 3 循环语句——《Swift3.0从入门到出家》
3 循环语句 当一段代码被多次重复利用的使用我们就使用循环 swift提供了三种形式的循环语句 1.while 循环 2.repeat — while 循环 3.for — in 循环 while 循 ...
- The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly
The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly 博客分类: 解决方案_Java 问题描述:T ...
- 1100 Mars Numbers
题意:进制转换. 思路:注意当数字是13的倍数时,只需高位叫法的单词.比如26,是“hel”,而不是“hel tret”.我被坑在这里了!对应语句1的处理.另外,在输入n和n个字符串之间需要一个吸收字 ...
- gcc及其选项详解
1.简介: gcc是gnu旗舰产品,目前基本上就是和unix捆绑在一起分发的.这个东西功能强大,但是有多达上千个选项,其用户手册也有将近一万行.虽然其中的多数选项平时很少用到.但是不管装软件还是写程序 ...
- nios 使用count binary 例程 只是led不闪
系统id有问题的总结: 1, 复位是否正确.(特别使用拨码开关的) 2, 硬件连接是否有问题.(SDRAM的时序约束可以有,也可以没有) 3, 引脚分配是否正确.(SDRAM的dqm就错过一次) 4, ...
- Chrome和IE的xss过滤器分析总结
chrome的xss过滤器叫xssAuditor,类似IE的xssFilter,但是他们有很大的内在区别 chrome xssAuditor工作原理 chrome的xss检测名称为 xssAudito ...
- 一个电脑同时运行 64bit 和 32bit 的eclipse 如何匹配 jdk环境
一个电脑同时运行 64bit 和 32bit 的 eclipse 如何匹配 jdk环境 1 eclipse 分 64bit 和 32bit 两种. 64bit的eclipse 只能搭配 64b ...
- requirejs——define——普通模块
一.普通模块可能包含的内容: 一个模块对应着一个js文件,由于模块可能包含着以下三种内容:模块名.依赖模块.返回给其他模块使用的参数:因此js文件根据包含内容的不同而写法不同. 一.传统的js脚本文件 ...