C++中的模板(函数模板,类模板)
1.模板是生成类或函数的框架,模板使用形参,当实际数据类型赋值给形参的时候,才由编译器生成类或函数
2.函数模板的声明由关键字template和包含一个或多个数据类型形参的参数列表构成,形参数据类型(T)前面可以是class也可以是typename,类型形参T要用尖括号<>括起来:
Template <typename T>或Template<classT>
3.函数模板的调用
#include "stdafx.h"
#include<stdio.h>
template <class T>
T max(T a,T b)
{
returna>b?a:b;
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("%d\n",max(3,10));//更ü完?善?写′法ぁax<int>(3,10)
printf("%f\n",max<double>(21.3,20.1));
return 0;
}
4.用作模板的类型可以是基本类型,也可以是一个类,类似于函数模板的做法,类模板对成员数据和成员函数的参数类型进行泛化,下面是一个模板类A,构造函数和comp函数均在模板声明中定义,成为内联函数,print_Type函数在模板外定义,需要用关键字template说明T1和T2是模板类型,并以A<T1,T2>::做函数的前缀作用域
//templae2.cpp : 定¨义?控?制?台?应畖用?程ì序ò的?入?口ú点?。£
//
#include "stdafx.h"
#include <stdio.h>
#include <typeinfo.h>
template <class T1,class T2>
class A{
T1 i;
T2 j;//
public:
A(T1 t1,T2 t2){i=t1;j=t2;}//内联函数
bool comp(){return i>j;}//内联函数
voidprint_Type();//函数声明
};
//成员函数printf_type定义
template <class T1,class T2>
voidA<T1,T2>::print_Type(){
printf("i的类型是%s\n",typeid(i).name());//打印i的类型名
printf("j的类型是?%s\n", typeid(j).name());
}
int _tmain(int argc, _TCHAR* argv[])
{ A<int,double> a(3,89.2);
if(a.comp())
{
printf("i>j\n");
}
else printf("i<=j\n");
a.print_Type();
return 0;
}
5.当模板的泛化处理不适合某个特定的数据类型时,可针对这个数据类型给出相应的模板,包括函数模板特化和类模板特化(叫完全特化技术也叫精确特化)