我们现在要计算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. php高级研发或架构师必了解---很多问题面试中常问到!
  2. 将内表通过TXT文本输出
  3. java系统高并发解决方案(转载)
  4. SSE入门
  5. C#连接mysql实例
  6. maven工程-eclipse红叹号
  7. Myeclipse快捷键的设置
  8. java_接口的应用
  9. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(二)
  10. Apriori算法-位运算-C语言
  11. 神奇的框架插件jquery layer
  12. 装 ubuntu + win10 出现 grub rescue 并处理之
  13. Order&amp;Shipping Transactions Status Summary
  14. 开发Oracle 函数
  15. spring4.0之八:Groovy DSL
  16. BibTex相关
  17. Python中hashlib模块
  18. Linux系统网络设备启动和禁止“ifconfig eth0 up/down”命令的跟踪
  19. Bzoj2818 Gcd(莫比乌斯反演)
  20. Linux操作系统--help、man和info工具的区别介绍

热门文章

  1. 关于quartus工程添加文件的说明
  2. 如何手玩5h uoj215 果冻运输得到 AC
  3. Spring和MyBatis整合
  4. 【ASP.NET Web API2】Digest认证
  5. 64位windows下mysql安装
  6. PMODB GT202 WIFI的使用
  7. 在Linux 64位系统下使用hugepage
  8. thinkphp中配置信息的二维数组设置与使用
  9. PL/SQL 训练03 --异常
  10. Rest之路 - 介绍篇