C++中的类属(泛型)机制——模板

函数模板

定义:带有类型参数的函数
格式:

template<class T1,class T2,....> //也可以是typename
<返回值类型><函数名>(<参数表>){
     
	......
}

T1、T2是函数模板的类型参数
使用函数模板定义的函数时需要提供具体类型,返回值类型,参数表中的参数类型以及函数体中的局部变量的类型可以是T1,T2等。示例:

template<class T> 
void sort(T elements[], unsigned int count){
     }

函数模板定义了一系列重载的函数,首先必须要对函数模板进行实例化(生成具体的函数),函数模板的实例化通常是隐式的,有时需要在程序中显式地实例化函数模板。示例:

#include 
using namespace std;

template<class T>
Swap(T &x, T &y){
     
    T tmp=x;
	x=y;
	y=tmp;
}

int main(){
     
	int a=1,b=2;
    double c=1.1,d=1.2;
    Swap(a,b); //隐式实例化
    cout<<a<<" "<<b<<endl; 
    Swap<double>(c,d);//显式实例化
    cout<<c<<" "<<d<<endl;
    return 0;
}

函数模板的偏特化、特化:

template<class T1, class T2>
void func(T1 a,T2 b){
     
	cout<<"default"<<endl;
}
//特化:全部模板参数特化
template<>
void func(double a,int b){
     
	count<<"double int"<<endl;
}
//偏特化:部分函数模板参数特化
template<class T2>
void func(float a,T2 b){
     
	cout<<"flaot"<<endl;
}

类模板

定义:如果一个类的成员的类型可变,则称为类属性
格式:

template<class T1, class T2, ...>
class <类名>{
     
	//类成员说明
}

与函数模板不同的是,类模板只能进行显式的实例化。如果有需要,可与模板函数结合,利用模板函数隐式实例化模板类。

类模板中的静态成员:

#include
using namespace std;

template<class T>
class A{
     
public:
	static int x;
};

template<class T>
int A<T>::x=12;


int main(){
     
	A<int> a1,a2;//a1和a2共享一个x
	A<double>b1,b2;//b1和b2共享一个x

	cout<<a1.x<<endl;
	cout<<a2.x<<endl;

	b1.x=15;
	cout<<b1.x<<endl;
	cout<<b2.x<<endl;
	return 0;
}

你可能感兴趣的:(c++,c++)