C++模版:函数模版初探

131 阅读2分钟

模版是泛型编程的基础。函数模版是通用的函数描述,可以用它来生成具体类型的函数。

下面介绍函数模版的基础知识。

函数的冗余问题

以交换函数为例,针对intdouble类型,需要定义2个函数。这2个函数的实现方式是一样的,唯一的区别是不同的参数类型。如果要满足所有的类型,那就要写很多相同的代码。

// int类型交换
void swapInt(int& a, int& b) {
  int temp = a;
  a = b;
  b = temp;
}
	
// double类型交换
void swapDouble(double& a, double& b) {
  double temp = a;
  a = b;
  b = temp;
}

定义一个通用的函数模版可以解决这个问题。用到哪种类型,就生成该类型的函数。

函数模版语法

函数模版的语法如下,<>包起来的是模版参数列表,可以有多个参数,用逗号分隔。下面的示例只定义了一个。

template<typename T>
函数声明或定义

template :关键字,表示定义模板

typename :关键字,表示一个类型参数

T :变量名,其值代表一个类型。在函数中使用。该变量名一般用大写表示。

定义函数模版

定义交换的函数模版

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

实例化函数模版

有2种使用函数模版的方式,编译器会生成一个特定版本的函数,这叫做实例化。

  • 编译器自动推导类型,隐式实例化
  • 显示指定类型,显示实例化

示例如下:

int main() {

  // 自动推导类型int,会生成void swap(int& a, int& b)
  int a = 1;
  int b = 2;
  swap(a, b);
  
  // 显示指定类型double,会生成void swap(double& a, double& b)
  double c = 3.0;
  double d = 4.0;
  swap<double>(a, b);

  return 0;
}

函数模版基础总结

  • 函数的冗余问题
  • 解决该问题的方案:函数模版
  • 如何定义函数模版
  • 2种使用函数模版的方式