相关文章推荐

我们知道可以利用函数模板来处理不同的数据类型,然而函数模板对于某些数据类型并不能处理,具有一定的局限性。那么应该如何解决该局限性呢?
例如经典的数据交换函数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;
                                    定义好函数模板后,当程序需要该函数模板定义的具体类型的函数时,编译器会根据该函数模板生成具体类型的函数定义,这种实例化方被称为隐实例化。例如:函数调用Swap(i, j)导致编译器生成Swap()的一个实例,该实例使用int类型。模板并非函数定义,但使用int的模板实例是函数定义。同时编译器之所以知道需要进行定义,是由于程序调用Swap()函数时提供了int参数。直接命令编译器创建特定的实例,如Swap ()。template[函数返回类型][函数模板名](函数参数列表)
                                    本文结合网上的资料对C++模板具体化做了一个总结。
 对于模板模板中的语句(函数体或者类)不一定能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。我们希望模板能够针对某种具体的类型使用不同的算法,可以使用具体化
对于给定的函数名可以有非模板函数模板函数具体化函数以及它们的重载函数具体化以template<>打头,并通过函数参数来指示类型
	优先级顺序为,非模板函数>具体化函数>模板函数函数模板中会有三个常见形实例化
	实例化
	具体化(特殊化)
1、隐实例化即常规的模板函数,声明以后它只是生成一个模板并不会生成函数定义。编译器接受一个特定类型为函数生成定义,如下方程序清单中的s
                                    函数模板具体化函数模板存在局限性,当定义函数模板时,我们始终假定函数体中的语句是合法的。例如定义如下函数模板:
template <typename T>
T add(T x, T y)
	return x + y;
如果T是内置数据类型,则x+y是合法的。例如,Ad(1,2)是合法的。但是,如果T用int*替换则是错误的,因为两个指针相加没有任何意义。例如,Add(a,b)是非法的,其中a,b声明如下:
int a[5] = { 1,2,3,4,5 };
int b[5].
                                    函数模板
C++函数模板实质上是一个生成函数的方,它的目的是减少重复劳动。在调用函数模板时,编译器会生成一个函数实例,这种方被称为隐实例化。当我们对不同类型的变量执行同样的操作时,如果用函数重载,会麻烦很多。
例如,我们打一个绝对值函数
int fabs (int a)
	return a>0?a:-a;
如果我们要对double类型也用绝对值函数,我们又得再打一个
double fabs (double a)
	return a>0?a:-a;
但如果用函数模板,那么
                                    函数模板是C++新增的一种性质,它允许只定义一次函数的实现,即可使用不同类型的参数来调用该函数。这样做可以减小代码的书写的复杂度,同时也便于修改(注:使用模板函数并不会减少最终可执行程序的大小,因为在调用模板函数时,编译器都根据调用时的参数类型进行了相应实例化)。下面来看看函数模板的使用过程:
struct job{    char name[20];    int salary;};
...