compare.cpp
上传用户:qdkongtiao
上传日期:2022-06-29
资源大小:356k
文件大小:3k
源码类别:

书籍源码

开发平台:

Visual C++

  1. /*
  2.  * This file contains code from "C++ Primer, Fourth Edition", by Stanley B.
  3.  * Lippman, Jose Lajoie, and Barbara E. Moo, and is covered under the
  4.  * copyright and warranty notices given in that book:
  5.  * 
  6.  * "Copyright (c) 2005 by Objectwrite, Inc., Jose Lajoie, and Barbara E. Moo."
  7.  * 
  8.  * 
  9.  * "The authors and publisher have taken care in the preparation of this book,
  10.  * but make no expressed or implied warranty of any kind and assume no
  11.  * responsibility for errors or omissions. No liability is assumed for
  12.  * incidental or consequential damages in connection with or arising out of the
  13.  * use of the information or programs contained herein."
  14.  * 
  15.  * Permission is granted for this code to be used for educational purposes in
  16.  * association with the book, given proper citation if and when posted or
  17.  * reproduced.Any commercial use of this code requires the explicit written
  18.  * permission of the publisher, Addison-Wesley Professional, a division of
  19.  * Pearson Education, Inc. Send your request for permission, stating clearly
  20.  * what code you would like to use, and in what specific way, to the following
  21.  * address: 
  22.  * 
  23.  *  Pearson Education, Inc.
  24.  *  Rights and Contracts Department
  25.  *  75 Arlington Street, Suite 300
  26.  *  Boston, MA 02216
  27.  *  Fax: (617) 848-7047
  28. */ 
  29. #include "tmpl_preamble.h"
  30. #include "Sales_item.h"
  31. // implement strcmp-like generic compare function 
  32. // returns 0 if the values are equal, 1 if v1 is larger, -1 if v1 is smaller
  33. template <typename T>
  34. int compare(const T &v1, const T &v2)
  35. {
  36.     if (v1 < v2) return -1;
  37.     if (v2 < v1) return 1;
  38.     return 0;
  39. }
  40. // repeats body of compare but with comments
  41. int f(int v1, int v2)
  42. {
  43.     if (v1 < v2) return -1;  // < on two objects of type T
  44.     if (v2 < v1) return 1;   // < on two objects of type T
  45.     return 0;                // return int;  not dependent on T
  46. }
  47. // special version of compare to handle C-style character strings
  48. template <>
  49. int compare<const char*>(const char* const &v1, 
  50.                          const char* const &v2)
  51. {
  52.     return strcmp(v1, v2);
  53. }
  54. // returns 0 if the values are equal, -1 if v1 is smaller, 1 if v2 is smaller
  55. int compare(const string &v1, const string &v2)
  56. {
  57.     if (v1 < v2) return -1;
  58.     if (v2 < v1) return 1;
  59.     return 0;
  60. }
  61. int compare(const double &v1, const double &v2)
  62. {
  63.     if (v1 < v2) return -1;
  64.     if (v2 < v1) return 1;
  65.     return 0;
  66. }
  67. int main()
  68. {
  69.     // T is int; 
  70.     // compiler instantiates int compare(const int&, const int&)
  71.     cout << compare(1, 0) << endl;  
  72.     // T is string; 
  73.     // compiler instantiates int compare(const string&, const string&)
  74.     string s1 = "hi", s2 = "world";
  75.     cout << compare(s1, s2) << endl; 
  76. {
  77.     short s1, s2;
  78.     int i1, i2;
  79.     compare(i1, i2);    // ok: instantiate compare(int, int)
  80.     compare(s1, s2);    // ok: instantiate compare(short, short)
  81. }
  82.     char *cp1 = "world", *cp2 = "hi";
  83.     cout << compare(cp1, cp2) << endl;       // compares pointer values!
  84. {
  85.     const char *cp1 = "world", *cp2 = "hi";
  86.     int i1, i2;
  87.     compare(cp1, cp2); // calls the specialization
  88.     compare(i1, i2);   // calls the generic version instantiated with int
  89. }
  90. {
  91.     const char *cp1 = "world", *cp2 = "hi";
  92.     compare<string>(cp1, cp2);  // converts arguments to string
  93. }
  94.     return 0;
  95. }