函数模板 及显式具体化(C++)

函数模板 将同一种算法应用与不同类型的函数时

#include<iostream>

#include<string> template

<typename T> void mymyswap(T &a, T &b);//每定义函数或者函数原型在前边都要加

template<typename name> int main()

{

using namespace std;

int i, j;

cin >> i >> j;

mymyswap(i, j);

cout << i<<" " << j;

}

template <typename T> void mymyswap(T &a, T &b)

//每定义函数或者函数原型在前边都要加

template<typename name> {

T temp; temp = a; a = b; b = temp;

}

2模板的局限性,假设传入数组,那么数组不能直接交换,要不然交换的就是地址,还有其他案例等,要根据情况使用模板

3显式具体化 :假设我们定义了一个结构体 在C++中,一个结构体可以直接赋值给另一个结构体 我们希望交换这个结构体的内容,可以使用 T temp; temp = a; a = b; b = temp;

在C++中,一个结构体可以直接赋值给另一个结构体 但是假设我们只想交换结构体实例化中两个中的floor或者floor和salary而不交换name成员,则需要不同的代码,需要额外写,函数重载也不能使用 然而可以提供一个具体化函数定义——成为显示具体化

定义: template <> 函数返回类型 函数名字 (参数), 而且必须先声明模板,才能进一步声明显式具体化函数
 

template <typename T> void myswap(T &, T &);

template <> void myswap<job>(job&, job&);//显式化原型

template <> void myswap<job>(job &a, job &b) {****************

}

下边将实现一个将结构体内信息部分调换的函数以及代码

template <typename T> void myswap(T &, T &);//函数模板

struct job //定义结构体

{ char name[40];

double salary;

int floor; };

template <> void myswap<job>(job&, job&);//在函数模板的基础上进一步定义显式化原型

template <> void myswap<job>(job &a, job &b) {

double t1;

int t2; //定义两个临时变量

t1 = a.salary;

a.salary = b.salary;

b.salary = t1;//交换两个结构体的salary变量

t2 = a.floor;

a.floor = b.floor;

b.floor = t2;//交换两个结构体的floor变量 }

void show(job& a)//将交换后的信息打印出来 {

using namespace std;

cout<< "名字:" << a.name <<endl;

cout <<"薪水:" << a.salary << endl;

cout <<"楼层:" <<a.floor << endl;

}

主函数

int main() {

using namespace std; job j1 = {"小明",5000,2};

job j2 = { "小红",8000,1 };

myswap(j1, j2);

show(j1);

show(j2);

}

posted @ 2023-07-30 11:34  有志者事竟成1019  阅读(15)  评论(0)    收藏  举报  来源