编程语言
首页 > 编程语言> > C++ 函数模板

C++ 函数模板

作者:互联网

  • 函数模板是通用的函数描述,是使用泛型来定义的函数。
  • 泛型可用具体的类型(如int,double)来替换。


1. 函数模板

1.1 什么是函数模板

template <typename T>		// 该句可改为: template <class T>
void swap(T& a, T& b){
	T temp;
	temp = a;
	a = b;
	b = temp;
}

    测试代码如下:

#include <iostream>

    
template <typename T>
void Swap(T& a, T& b);      // 1. 模板函数-原型   

int main() {                // 3. 主函数测试
    using namespace std;
    int a =  10;
    int b = 999;
    
    Swap(a,b);
    cout << "a:" << a << ", b:" << b << ".\n";
    
    return 0;
}

template <typename T>		// 2. 模板函数-定义   
void Swap(T& a, T& b){
	T temp;
	temp = a;
	a = b;
	b = temp;
}

a:999, b:10.

1.2 重载的函数模板

#include <iostream>

    
template <typename T>
void Swap(T& a, T& b);          // 模板函数 1 

template <typename T>
void Swap(T* a, T* b, int n);   // 模板函数 2 

int main() {                   
    using namespace std;
    
    int a =  10;				// 测试 模板函数 1
    int b = 999;
    Swap(a,b);
    cout << "a:" << a << ", b:" << b << ".\n";
    
    int arr[5] = {1,2,3,4,5};	// 测试 模板函数 2
    int brr[5] = {11,12,13,14,15};
    Swap(arr,brr,5);
    cout << "arr: ";
    for (auto i:arr)
        cout << i << " ";
    
    return 0;
}

template <typename T>		// 模板函数 1
void Swap(T& a, T& b){
	T temp;
	temp = a;
	a = b;
	b = temp;
}

template <typename T>		// 模板函数 2
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;
	}
}

a:999, b:10.
arr: 11 12 13 14 15


2. 具体化

2.1 显式具体化

struct job{
	char name[40];
	double salary;
};

要点总结:

void Swap(job& a, job& b);					// 1. 非模板函数原型

template<typename T>
void Swap(T& a, T& b);						// 2. 模板函数原型

template<> void Swap<job>(job& a, job& b);	// 3. 显式具体化
template<> void Swap(job& a, job& b);		// 3. 显式具体化

    测试代码:

#include <iostream>

struct job{
	char name[40];
	double salary;
};
    
template <typename T>
void Swap(T& a, T& b);                      // 常规版本

template <> void Swap<job>(job& a, job& b); // 显式具体化

using namespace std;
int main() {    
    
    job job_a = {"mike",100.0};               // 测试 显式具体化
    job job_b = {"alex",888.8}; 
    Swap(job_a,job_b);
    
    cout << "job_a: " << job_a.name << ", salary:" << job_a.salary << endl;
    cout << "job_b: " << job_b.name << ", salary:" << job_b.salary << endl;
    
    return 0;
}

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

template <>	void Swap<job>(job& a, job& b){ 
	double temp;
	temp = a.salary;
	a.salary = b.salary;
	b.salary = temp;
}

job_a: mike, salary:888.8
job_b: alex, salary:100

2.2 实列化

template void Swap<double>(double, double);	// 显式实列化

2.3 实列化 与 具体化

template void Swap<double>(double, double);			// 显式实列化

template<> void Swap<double>(double& , double& );	// 显式具体化-1
template<> void Swap(double& , double& );			// 显式具体化-2
  • I. 显式具体化意思是不要使用Swap()模板来生成函数定义,应该使用专门为 double 类型显式定义的函数定义。这些原型必须有自己的函数定义。
  • II. 显式具体化声明在关键字 template 后有<>, 而显式实例化没有。
  • III. 试图在同一个文件中使用同一种类型的 显式实列化 和显式具体化将出错。
...
template <typename T>
void Swap(T&, T&);                          // 1. 模板原型

template<> void Swap<job>(job&, job&);      // 2. 显式具体化

int main(){
    template void Swap<char>(char&, char&); // 3. 显式实列化
    
    short a,b;
    ...
    Swap(a,b);                              // 4. 隐式实列化
    
    job n,m;
    ...
    Swap(n,m);  // 使用显式具体化
    
    char g,h;
    ...
    Swap(g,h);  // 使用显式实列化
}

标签:函数,显式,C++,Swap,template,具体化,模板
来源: https://blog.csdn.net/u013271656/article/details/114484234