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

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int square(int x) {
  5. return x*x;
  6. }
  7.  
  8. double square(double x) {
  9. return x*x;
  10. }
  11.  
  12. int main() {
  13. cout << square() << endl;
  14. cout << square(5.5) << endl;
  15. system("pause");
  16. }

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

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

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. template <class T>
  5. T square(T x) {
  6. return x*x;
  7. }
  8.  
  9. int main() {
  10. cout << square<int>() << endl;
  11. cout << square<double>(5.5) << endl;
  12. system("pause");
  13. }

注意:在使用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类。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. template <class T>
  5. class MyVector{
  6. int size;
  7. T arr[];
  8. public:
  9. MyVector() : size () { }
  10. void push(T x) {
  11. arr[size] = x;
  12. size++;
  13. }
  14. void print() const {
  15. for(int i=; i<size; i++)
  16. cout << arr[i] << endl;
  17. }
  18. };
  19.  
  20. /* 在类外部实现函数的写法。
  21. template <class T>
  22. void MyVector<T>::push(T x) {
  23. arr[size] = x;
  24. size++;
  25. }
  26. */
  27.  
  28. int main() {
  29. MyVector<int> My;
  30. My.push();
  31. My.push();
  32. My.push();
  33. My.push();
  34. My.print();
  35. system("pause");
  36. }

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就完成任务。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. template <class T>
  5. T square(T x) {
  6. return x*x;
  7. }
  8.  
  9. template <class T>
  10. class MyVector{
  11. int size;
  12. T arr[];
  13. public:
  14. MyVector() : size () { }
  15. void push(T x) {
  16. arr[size] = x;
  17. size++;
  18. }
  19. void print() const {
  20. for(int i=; i<size; i++)
  21. cout << arr[i] << endl;
  22. }
  23. int getSize() const { return size; }
  24. T get(int i) const { return arr[i]; }
  25. };
  26.  
  27. template <class T>
  28. MyVector<T> operator *(const MyVector<T> &v1, MyVector<T> &v2) {
  29. MyVector<T> ret;
  30. int size = v1.getSize();
  31. for(int i=; i<size; i++) {
  32. T x = v1.get(i) * v2.get(i);
  33. ret.push(x);
  34. }
  35. return ret;
  36. }
  37.  
  38. int main() {
  39. MyVector<int> My;
  40. My.push();
  41. My.push();
  42. My.push();
  43. My.push();
  44. My.print();
  45. cout << "After square" << endl;
  46. MyVector<int> NewVector;
  47. NewVector = square(My);
  48. NewVector.print();
  49. system("pause");
  50. }

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. 公历和农历转换的JS代码

    <!-- function CalConv(M) { FIRSTYEAR = 1936; LASTYEAR = 2031; LunarCal = [ new tagLunarCal(23, 3, ...

  2. 【spring源码学习】spring的事件发布监听机制源码解析

    [一]相关源代码类 (1)spring的事件发布监听机制的核心管理类:org.springframework.context.event.SimpleApplicationEventMulticast ...

  3. 在WORD2007中添加修改组件

    从网上查到这个,但不知道怎么设置选项内容,及如何出现选项.能否详细说明下,谢谢!1).在开始操作前,请先点击窗口左上角的office按钮,打开word选项,在常规窗口中,勾选在功能区显示开发工具选项卡 ...

  4. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

  5. RMAN 增量备份 脚本

    ################################################################## ##    rman_backup.sh              ...

  6. tomcat启动报错:java.lang.NoClassDefFoundError

    tomcat启动加载spring配置文件时报错,找不到类GetBooksRequest,经排查实际上该类已经存在.后来发现日志里还有一句: This is very likely to create ...

  7. PHP echo汉字出现乱码的情况之一

    当然首先要理清楚到底是web服务端造成,php造成的,还是数据库造成的. 需要在头文件里UTF-8 <head> <meta http-equiv="Content-Typ ...

  8. 20位活跃在Github上的国内技术大牛

    登录|注册     leon-这个程序员不闷骚的博客 喜欢leon,有追求有原则有爱心的杀手,做一个有追求的程序员,代码是程序员的朋友,虽然没有热情,但是非常忠实.希望拥有一身绝世武功,再配一把绝世好 ...

  9. POJ2478(欧拉函数)

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15242   Accepted: 6054 D ...

  10. 解决Maven提示:Could not read settings.xml, assuming default values

    本文转载自:http://blog.csdn.net/hqocshheqing/article/details/47702049 最近在学习Maven  时总是出现 Could not read se ...