C++函数模板

278 阅读2分钟

函数模板

函数模板是通用的函数描述,他们使用泛型来定义函数,其中的泛型可用具体的类型(如int和double)替换。通过将类型作为参数传递给模板,可是编译器生成该类型的函数。由于模板允许以泛型(而不是具体类型)的方式编写程序,因此有时也被称为通用编程。由于类型是用参数表示的,因此模板特性有时也被称为参数化类型。

函数模板允许以任意类型的方式来定义函数。

 temeplate<typeName AnyType>
 void Swap(AnyType &a,AnyType &b)
 {
     AnyType temp;
     temp=a;
     a=b;
     b=temp;
 }

第一行指出,要建立一个模板,并将类型命名为AnyType.关键字template和typename是必需的,除非使用关键字lass代替typename.另外,必须使用尖括号。余下代码描述了交换两个AnyType值的算法。模板并不创建函数,而只是告诉编译器如何定义函数。

类模板:

  temeplate<class AnyType>
 void Swap(AnyType &a,AnyType &b)
 {
     AnyType temp;
     temp=a;
     a=b;
     b=temp;
 }

重载模板: 需要对多个不同类型使用同一种算法的函数时,可使用模板。然而并非所有的类型都使用相同的算法。为满足这种需求,可以像重载常规函数定义那样重载模板定义。(特征标必须不同) #include template void Swap(T &a, T &b);

template<typename T>
void Swap(T *a, T *b, int n);
void Show(int a[]);

const int Lim = 8;
int main()
{
	using namespace std;
	int i = 10, j = 20;
	cout << "i,j = " << i << "," << j << endl;
	cout << "using compiler-generated int swapper:\n";
	Swap(i, j);
	cout << "Now i,j = " << i << "," << j << endl;

	int d1[Lim] = { 0,7,0,4,1,7,7,6 };
	int d2[Lim] = { 0,7,2,0,1,9,6,9 };
	cout << "original arrays:\n";
	Show(d1);
	Show(d2);
	Swap(d1, d2, Lim);
	cout << "Swapped arrays:\n";
	Show(d1);
	Show(d2);
	return 0;
}

template<typename T>
void Swap(T &a, T &b)
{
	T temp;
	temp = a;
	a = b;
	b = temp;
}

template<typename T>
void Swap(T a[], T b[], int n)
{
	T temp;
	for (int i = 0; i < n; i++)
	{
		temp = a[i];
		a[i] = b[i];
		b[i] = temp;
	}
}

void Show(int a[])
{
	using namespace std;
	cout << a[0] << a[1] << "/";
	cout << a[2] << a[3] << "/";
	for (int i = 4; i < Lim; i++)
		cout << a[i];
	cout << endl;
}