C++函数模板的显式具体化

版权声明:版权归作者祝枫所有,欢迎保留原文链接进行转载。 https://blog.csdn.net/Vince_ZHU/article/details/85036662

我们知道可以利用函数模板来处理不同的数据类型,然而函数模板对于某些数据类型并不能处理,具有一定的局限性。那么应该如何解决该局限性呢?
例如经典的数据交换函数Swap

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

我们可能希望利用上述的函数模板实现不同类型数据的交换,然而对于数组合结构体数据类型,以上函数模板并不能使用。那么应该如何解决这个问题呢?

显式具体化

利用对函数模板的显式具体化,可以解决以上问题,即明确指出哪种数据类型另外采用某一种具体化的其他方法。
假设定义了如下结构体:

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

现在希望交换两个这种结构体的内容,原来Swap函数模板中的代码虽然也适用,因为C++允许将一个结构体赋给另外一个结构体。然而,如只想交换salary和floor成员,而不交换name成员,则需要使用不同的代码,但Swap函数的参数将保持不变,因此无法使用模板重载来提供其他代码。
这里,可以提供一个具体化函数定义,称之为显式具体化,其中包含所需的代码。当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再继续寻找模板。
C++98标准选择了下面的具体化方法。其原型和定义以template<>开头,并通过名称指出类型。函数调用优先级是 非模板函数>具体化模板函数>常规模板函数。
针对上述需求,可以针对只交换结构体某个内容编写显式具体化代码,如下:

template <> void Swap<job> (job &j1, &job &j2)
{
double t1;
int t2;
t1 = j1.salary;
t2 = j1.floor;
j1.salary = j2.salary;
j1.foor = j2.floor;
j2.salary = t1;
j2.floor = t2;
}

猜你喜欢

转载自blog.csdn.net/Vince_ZHU/article/details/85036662