一、模板(Template):
C++提供了模板机制,即函数模板和类模板。一种参数化类型机制,对应于JAVA和C#的泛型,字面意思来讲即建立一个通用的函数或类,这些函数和类的形参类型是模糊的,可以为任一类型,用虚拟形参表示,这就给代码的重用带来了极大的便利。比如当我们进行比较不同类型的数据的大小时,无需写两段除参数类型不同以外一模一样的代码来实现此功能。
二、语法:
template<模板行参1,模板行参2...> 或 template<模板形参1,模板形参2...>
返回参数 函数名(模板参数表) class 类名
{ {
函数体
} };
提示:在template语句和函数模板定义语句间不能有其它语句。
模板形参:1.表示类型的类型形参,跟在关键字class或typename后声明。
2.表示常量表达式的非类型形参,允许为整型或枚举型、到对象的指针或函数指针、到对象的引用或 函数引用、成员指针。不允许声明为浮点型、class型、void型。
一个简单的判断大小程序,其中模板参数定义了两个不同的类型。
C++提供了模板机制,即函数模板和类模板。一种参数化类型机制,对应于JAVA和C#的泛型,字面意思来讲即建立一个通用的函数或类,这些函数和类的形参类型是模糊的,可以为任一类型,用虚拟形参表示,这就给代码的重用带来了极大的便利。比如当我们进行比较不同类型的数据的大小时,无需写两段除参数类型不同以外一模一样的代码来实现此功能。
二、语法:
template<模板行参1,模板行参2...> 或 template<模板形参1,模板形参2...>
返回参数 函数名(模板参数表) class 类名
{ {
函数体
} };
提示:在template语句和函数模板定义语句间不能有其它语句。
模板形参:1.表示类型的类型形参,跟在关键字class或typename后声明。
2.表示常量表达式的非类型形参,允许为整型或枚举型、到对象的指针或函数指针、到对象的引用或 函数引用、成员指针。不允许声明为浮点型、class型、void型。
模板参数:1.允许是另外一个类模板,称为模板的模板参数。例如:
template<template <class T> class X> class A { }; //类模板A的第二个参数是另外一个类模板X
template<class T> class B { };
A<B> a; //模板A的实际使用。其中的B是模板的模板实参
2.模板参数可以给出默认值,但如果一个模板参数给出默认值,则其它的模板参数必须全部给出默认值。例如:
template<class T=char,class U,class V=int> class X { }; //编译出错
3.一个模板的各此声明给出的模板参数的默认值可以累积其效果。例如:
template<class T, class U = int> class A;
template<class T = float, class U> class A; //前两行不得互换,因为前文第2点
template<class T, class U> class A {
public:
T x;
U y;
};
A<> a; //a.x是float类型,a.y是int类型
4.在同一作用域中不能对同一个模板的同一个参数多次声明其默认值。例如:
template<class T = char> class X;
template<class T = char> class X { };//编译报错。如果在本行中不给出模板参数T的默认值将编译通过
三、实例:
一个简单的判断大小程序,其中模板参数定义了两个不同的类型。
#include "stdafx.h"
#include <iostream>
using namespace std;
template<typename T1,typename T2>
T1 max(T1 x,T2 y)
{
return x>y? x:y;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a=10;
double b=22.5;
cout<<max(a,b)<<endl; //此时输出为22
return 0;
}
先来看看模板函数的返回类型定义为了T1,那么在主函数中调用max()函数时返回的类型根据主函数来确定为int类型。当返回类型定义为T2时,则输出为22.5,可以看到返回类型决定着函数调用时的输出类型。而如果返回类型定义为T,则编译器报错,原因在于编译器无法确定函数的返回类型。那么换一种写法:
#include "stdafx.h"
#include <iostream>
using namespace std;
template<typename T1,typename T2>
T1 max(T1 x,T2 y)
{
cout<< (x>y? x:y)<<endl;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a=10;
double b=22.5;
max(a,b); //输出为22.5
return 0;
}
可以看到在换为cout时,函数的调用时返回类型不起任何作用,只会返回最大的值,无论返回类型为T1还是int或double都不影响其值。