1.
模板的概念。
我们已经学过重载(Overloading)
,对重载函数而言,C++
的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值
,我们定义MAX()
函数需要对不同的数据类型分别定义不同重载(Overload)
版本。
//
函数1.
int max(int
x,int
y);
{return(x>y)?x:y ;}
//
函数2.
float max( float
x,float
y){
return (x>y)? x:y ;}
//
函数3.
double max(double
x,double
y)
{return (c>y)? x:y ;}
但如果在主函数中,我们分别定义了 char a,b;
那么在执行max(a,b);
时 程序就会出错,因为我们没有定义char
类型的重载版本。
现在,我们再重新审视上述的max()
函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++
引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
2.
函数模板的写法
函数模板的一般形式如下:
Template <class
或者也可以用typename
T>
返回类型 函数名(形参表)
{//
函数定义体 }
说明: template
是一个声明模板的关键字,表示声明一个模板关键字class
不能省略,如果类型形参多余一个 ,每个形参前都要加class <
类型 形参表>
可以包含基本数据类型可以包含类类型.
请看以下程序:
//Test.cpp
#include
<iostream>
using
std::cout;
using
std::endl;
//
声明一个函数模版,
用来比较输入的两个相同数据类型的参数的大小,class
也可以被typename
代替,
//T
可以被任何字母或者数字代替。
template
<class
T>
T min(T x,T y)
{ return
(x<y)?x:y;}
void
main( )
{
int
n1=2,n2=10;
double
d1=1.5,d2=5.6;
cout<< "
较小整数:"
<<min(n1,n2)<<endl;
cout<< "
较小实数:"
<<min(d1,d2)<<endl;
system("PAUSE"
);
}
程序运行结果:
程序分析:main()
函数中定义了两个整型变量n1 , n2
两个双精度类型变量d1 , d2
然后调用min( n1, n2);
即实例化函数模板T min(T x, T y)
其中T为int
型,求出n1,n2
中的最小值.同理调用min(d1,d2)
时,求出d1,d2
中的最小值.
3.
类模板的写法
定义一个类模板:
Template < class
或者也可以用typename
T >
class
类名{
//类定义......
};
说明:其中,template
是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。
例如:定义一个类模板:
// ClassTemplate.h
#ifndef
ClassTemplate_HH
#define
ClassTemplate_HH
template
<typename
T1,typename
T2>
class
myClass{
private
:
T1 I;
T2 J;
public
:
myClass(T1 a, T2 b);//Constructor
void
show();
};
//
这是构造函数
//
注意这些格式
template
<typename
T1,typename
T2>
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
//
这是void show();
template
<typename
T1,typename
T2>
void
myClass<T1,T2>::show()
{
cout<<"I="
<<I<<", J="
<<J<<endl;
}
#endif
// Test.cpp
#include
<iostream>
#include
"ClassTemplate.h"
using
std::cout;
using
std::endl;
void
main()
{
myClass<int
,int
> class1(3,5);
class1.show();
myClass<int
,char
> class2(3,'a'
);
class2.show();
myClass<double
,int
> class3(2.9,10);
class3.show();
system("PAUSE"
);
}
最后结果显示:
4.非类型模版参数
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。
template
<typename
T, int
MAXSIZE>
class
Stack{
Private:
T elems[MAXSIZE];
…
};
Int main()
{
Stack<int
, 20> int20Stack;
Stack<int
, 40> int40Stack;
…
};
相关推荐
一篇关于C++模板 设计模式 软件架构的文档,里面实现了一个泛化的命令模式和观察者模式
本篇文章主要介绍了浅谈C++模板元编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
模板是C++泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。 什么是模板 假定我们希望编写一个函数来比较两个值,并指出第一个值是小于、等于还是大于等于第二值。在实际中,我们可能想要定义多个函数...
下面小编就为大家带来一篇浅谈C++内存分配及变长数组的动态分配。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
ISO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下: [capture list] (parameter list) ->return type { function body } 简单的讲一下各个部分的作用 1.[capture list]捕获列表,捕获到函数体中,使得...
map 先看一个经典的单词计数器程序: map word_count;//定义string到size_t的map string word ; while(cin>>word) ++word_count[word];//提取word的计数器并...关联容器跟顺序容器类似的d地方是他们都是模板,在定义m
下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、...
本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...
下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、...
也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...