C++ 函数模板

0
15

C++ 函数模板

定义:通用的函数描述,使用泛型来定义函数,其中的泛型可用具体的类型(如 int、double )替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。

建立模板:

1 template <typename AnyType>
2 void Swap(AnyType & a, AnyType & b)
3 {
4     AnyType temp;
5     temp=a;
6     a=b;
7     b=temp;
8 }

  • 关键字 template 和 typename 是必须的,除非使用关键字 class 代替 typename 。另外,必须使用尖括号 < > 。

重载的模板:

  • 定义:

    • 起因:使用模板时并非所有的类型都使用相同的算法。
    • 解决:像重载常规函数那样重载模板定义。和常规重载一样,被重载的模板的函数特征标必须不同。
    • ( T &, T & ) ( T[], T[], int )

模板的局限性:

  • 无法处理一些类型,如 swap(T &a, T &b) 无法交换数组。
  • 有时通用化是有意义的,但 C++ 语法不允许,如将两个结构相加。
    • 重载运算符
    • 提供具体化模板定义。

显示具体化:

  • template<> 打头,通过名称指出类型。
    1 template<typename T>
    2 void Swap(T &, T &);
    3 
    4 template<> void Swap<job>(job &, job &); // 或 template<> void Swap(job &, job &);

  • 非模板优先于模板,而显示具体化优先于常规模板。

模板实例:

  • 编译器使用模板为特定类型生成函数定义时,得到的是模板实例。
  • 隐式实例化、显示实例化

显示实例化:

  • template void Swap<int>(int, int);
  • 声明时没有定义。
  • 可直接在程序中使用而不声明Add<double>(double 实参1, double 实参2)
  • 实参转形参数具备强转功能,精度降低不警告。
    1 int i;
    2 double j;
    3 Add<double>(i,j); // 参数 i 传递的值被转换成了 double 类型

注意:

  • 在同一个文件或转换单元中使用同一种类型的显示实例和显示具体化将出错。
  • 模板并不创建任何函数,而只是告诉编译器如何定义函数。
  • 在标准 C++ 98 添加关键字 typename 之前,C++ 使用关键字 class 来创建模板。
  • 常见的情形是:将模板放在头文件中,并在需要使用模板的文件中包含头文件。
  • 如果需要多个将同一种算法用于不同类型的函数,使用模板;如果不考虑向后兼容的问题,并愿意键入较长的单词,则声明类型参数时,应用 typename 而不是 class 。
  • 函数模板不能缩短可执行程序。最终的代码不包含任何模板,而只包含为程序生成的函数。使用模板的好处是使生成多个特定函数定义起来更简单、可靠。

<

发布回复

请输入评论!
请输入你的名字