home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 February / Chip_2001-02_cd1.bin / chplus / poly / soucet3.cpp < prev   
C/C++ Source or Header  |  2001-01-03  |  2KB  |  79 lines

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //   soubor:  soucet3.cpp
  4. //   projekt: Sablony v C++ - specializace trochu jinak
  5. //   autor:   Jaroslav Franek
  6. //   (c) 2000 Jaroslav Franek
  7. //
  8. //   Tridy rysu
  9. //      funkce soucet - pokus 3 s vyuzitim tridy rysu
  10. //
  11. ////////////////////////////////////////////////////////////////////////////
  12.  
  13. #pragma hdrstop
  14. #include <condefs.h>
  15. #include <iostream>
  16.  
  17. ////////////////////////////////////////////////////////////////////////////
  18. //
  19. //  trida rysu (traits-class), ktera urcuje vysledny typ souctu
  20. //
  21. ////////////////////////////////////////////////////////////////////////////
  22.  
  23. // primarni sablona
  24. template <class LEVY, class PRAVY> struct VysledekPlus {};
  25.  
  26. // explicitni specializace pro int + short
  27. template <> struct VysledekPlus<int, short>
  28. {
  29.    typedef int typ;
  30. };
  31.  
  32. // explicitni specializace pro double + int
  33. template <> struct VysledekPlus<double, int>
  34. {
  35.    typedef double typ;
  36. };
  37.  
  38. // explicitni specializace pro int + double
  39. template <> struct VysledekPlus<int, double>
  40. {
  41.    typedef double typ;
  42. };
  43.  
  44. // zkusime si pomoct makrem
  45.  
  46. #define VYSL(a,b,c) template <> struct VysledekPlus<a, b > { typedef c typ; }
  47.  
  48. VYSL(short, int, int);
  49. VYSL(int, int, int);
  50. // atd...
  51. // zde se omezime jen na nekolik specializaci
  52.  
  53. ////////////////////////////////////////////////////////////////////////////
  54. //
  55. //  definice funkce soucet s vyuzitim tridy rysu
  56. //
  57. ////////////////////////////////////////////////////////////////////////////
  58.  
  59. template <class LEVY, class PRAVY>
  60. typename VysledekPlus<LEVY, PRAVY>::typ soucet(LEVY levy, PRAVY pravy)
  61. {
  62.    typedef typename VysledekPlus<LEVY, PRAVY>::typ result_t;
  63.    return result_t(levy + pravy);
  64. }
  65.  
  66. //---------------------------------------------------------------------------
  67. #pragma argsused
  68. int main(int argc, char* argv[])
  69. {
  70.    int a = 3;
  71.    short c = 5;
  72.  
  73.    // nyni uz bez problemu
  74.    int b = soucet(a, c);
  75.    std::cout << '\n' << b;
  76.  
  77.    return 0;
  78. }
  79.