C++ 函数模板

模板的意义:

  假设我们需要实现一个交换函数Swap,入参可以是int,double,class,···。如果对于每中类型都实现一个Swap函数,效率低下,并且容易漏掉某些类型。这样的话用模板就比较好了。

定义:
template <class AnyType>
void Swap(AnyType &a, AnyType &b)
{
    AnyType temp;
    temp = a;
    a = b;
    b = temp;
}

使用很简单,直接调用。

但是模板有一个不好的地方,就是如果 AnyType 是一个 struct 结构,我们需要交换这2个结构体中的某些元素的值,这个模板就不能按要求完成工作了。这里的一个方案就是对这个特殊结构的交换操作重新实现一个交换函数,这里就有一个问题了,如果我们单独实现了一个函数,当调用Swap函数时,我们使用的是具体实现的函数,还是使用模板生成的函数呢?

这里就需要标准了。

ISO/ANSI C++标准 -- 第三代具体化

  1. 对于给定的函数名,可以是非模板函数,模板函数和显示具体话模板函数

  2. 显示具体化模板函数的原型和定义应以 template <> 开始

  3. 具体化将覆盖模板函数,非模板函数将覆盖具体化和模板函数

#include <iostream>

using namespace std;

struct ijob {
	int a;
	double b;
};

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

// 非模板,具体函数
void Swap(ijob &ia, ijob &ib) {
	double temp;
	temp = ia.b;
	ia.b = ib.b;
	ib.b = temp;
}

// 模板具体化函数
template<> void Swap<ijob> (ijob &ia, ijob &ib) {
	int temp;
	temp = ia.a;
	ia.a = ib.a;
	ib.a = temp;
}

int main() {
	int a = 1, b = 2;
	Swap(a, b);
	cout << "a = " << a << "; b = " << b << endl;

	ijob ia, ib;
	ia.a = 1;
	ia.b = 1.00;
	ib.a = 2;
	ib.b = 2.00;
	Swap(ia, ib);
	cout << "ia.a = " << ia.a << ", ia.b = " << ia.b << endl;
	cout << "ib.a = " << ib.a << ", ib.b = " << ib.b << endl;
	return 0;
}

结果:

总结:
  1. 函数模板本身并不会生成函数的定义,它只是一个用于生成函数定义的方案

  2. 当编译器编译代码的时候,会根据具体的类型生成函数定义,就是我们可以调用的函数,这个过程为模板的实例化

    ,这种实例化称为隐式实例化

  3. 模板也是可以显示实例化的,只需在前面加上 template 关键字

  4. 显示具体化就是在前面加上 template <>

问题

显示具体化和显示实例化的区别是什么?不懂,但是同一个编程单元中,不能同时显示具体化和显示实例化。

参考:

C++ Primer 5th

你可能感兴趣的:(C++,函数模板)