twoswap.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // twoswap.cpp -- specialization overrides a template
  2. #include <iostream>
  3. template <typename T>
  4. void Swap(T &a, T &b);
  5. struct job
  6. {
  7. char name[40];
  8. double salary;
  9. int floor;
  10. };
  11. // explicit specialization
  12. template <> void Swap<job>(job &j1, job &j2);
  13. void Show(job &j);
  14. int main()
  15. {
  16. using namespace std;
  17. cout.precision(2);
  18. cout.setf(ios::fixed, ios::floatfield);
  19. int i = 10, j = 20;
  20. cout << "i, j = " << i << ", " << j << ".\n";
  21. cout << "Using compiler-generated int swapper:\n";
  22. Swap(i,j); // generates void Swap(int &, int &)
  23. cout << "Now i, j = " << i << ", " << j << ".\n";
  24. job sue = {"Susan Yaffee", 73000.60, 7};
  25. job sidney = {"Sidney Taffee", 78060.72, 9};
  26. cout << "Before job swapping:\n";
  27. Show(sue);
  28. Show(sidney);
  29. Swap(sue, sidney); // uses void Swap(job &, job &)
  30. cout << "After job swapping:\n";
  31. Show(sue);
  32. Show(sidney);
  33. // cin.get();
  34. return 0;
  35. }
  36. template <typename T>
  37. void Swap(T &a, T &b) // general version
  38. {
  39. T temp;
  40. temp = a;
  41. a = b;
  42. b = temp;
  43. }
  44. // swaps just the salary and floor fields of a job structure
  45. template <> void Swap<job>(job &j1, job &j2) // specialization
  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
  60. << " on floor " << j.floor << endl;
  61. }