【C++】如何理解函数模板【3】--重载的函数模板+显式具体化模板函数

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

  • 给定函数名,可以由非模板函数、模板函数和显式具体化模板函数以及重载
  • 显式具体化的原型和定义以  template<>开头,通过名称来指出类型
  • 具体化优先于常规模板,非模板函数优于具体化和常规模板

举例:


  
  1. //非模板函数
  2. void Swap(job &, job &)
  3. //模板函数
  4. template <typename T>
  5. void Swap(T &, T &)
  6. //显式具体化模板函数
  7. template <> void Swap<job> (job &, job &);

程序


  
  1. // --8.13 模板,显示具体化实例
  2. #include<iostream>
  3. template <typename T>
  4. void Swap(T &a, T &b);
  5. //模板
  6. struct job
  7. {
  8. char name[40];
  9. double salary;
  10. int floor;
  11. };
  12. //模板具体化实例
  13. template <> void Swap<job>(job &j1, job & j2);
  14. void Show(job &j);
  15. int main()
  16. {
  17. using namespace std;
  18. cout.precision(2);
  19. cout.setf(ios::fixed, ios::floatfield);
  20. int i = 10, j = 20;
  21. cout << "i, j=" << i << ", " << j << ".\n";
  22. cout << "使用模板 int" << endl;
  23. Swap(i, j);
  24. cout << "NOW i, j = " << i << ", " << j << ".\n";
  25. job sue = { "Allen Blue", 100.15, 45 };
  26. job sidney = { "Siney Tadf", 120.45, 9 };
  27. cout << "Before job swapping:\n";
  28. Show(sue);
  29. Show(sidney);
  30. Swap(sue, sidney);
  31. cout << "After job swapping:\n";
  32. Show(sue);
  33. Show(sidney);
  34. return 0;
  35. }
  36. template<typename T>
  37. void Swap(T &a, T &b) //普通模式
  38. {
  39. T temp;
  40. temp = a;
  41. a = b;
  42. b = temp;
  43. }
  44. //显式,并且只交换其中两个
  45. template <> void Swap<job>(job &j1, job &j2)
  46. {
  47. double t1;
  48. int t2;
  49. t1 = j1.salary;
  50. j1.salary = j2.salary;
  51. j2.salary = t1;
  52. t2 = j1.floor;
  53. j1.floor = j2.floor;
  54. j2.floor = t2;
  55. }
  56. void Show(job &j)
  57. {
  58. using namespace std;
  59. cout << j.name << ": $ " << j.salary << " on floor " << j.floor << endl;
  60. }

结果

 

 

 

 

 

 

 

 

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/95348932

(完)