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

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //   soubor:  numerika.cpp
  4. //   projekt: Sablony v C++ - specializace trochu jinak
  5. //   autor:   Jaroslav Franek
  6. //   (c) 2000 Jaroslav Franek
  7. //
  8. //   Tridy rysu
  9. //      informace o numerickych typech
  10. //         std::numeric_limits, numeric_maxpromote
  11. //
  12. //   Poznamka: take se dozvite, ze tridu rysu lze definovat
  13. //             pomoci metafunkce a jak se ladi metaprogramy
  14. //
  15. ////////////////////////////////////////////////////////////////////////////
  16.  
  17. #pragma hdrstop
  18. #include <condefs.h>
  19.  
  20. #include <iostream>
  21. #include <limits>
  22.  
  23. using namespace std;
  24.  
  25. //
  26. //  nejaka trida, ktera nema s numerickym typem nic spolecneho
  27. //
  28. class cMojeTrida
  29. {
  30. };
  31.  
  32. //
  33. // Je na case zkusit neco slozitejsiho
  34. //
  35. // trida rysu numeric_maxpromote
  36. //
  37. // O co jde: pro numericke typy provede rozsireni
  38. //           na maximalni moznou presnost (long double)
  39. //           pro ostatni typy neprovede nic
  40. // Vlastne to bude implementovano jako metafunkce
  41. // vstupni parametr je nejaky typ
  42. // vystupem je take typ
  43. //
  44.  
  45. //
  46. //  pomocna trida, (take metafunkce)
  47. //
  48. template <class TYP, bool B> struct Rozhodni
  49. {
  50.    typedef TYP return_type;
  51. };
  52.  
  53. // parcialni specializace
  54. template <class TYP> struct Rozhodni<TYP, true>
  55. {
  56.    typedef long double return_type;
  57. };
  58.  
  59. // a nyni uz slibena trida rysu
  60. template <class TYP> struct numeric_maxpromote
  61. {
  62.    // POZN: je to mensi zahada, ale Borland C++ Builder 4.0
  63.    // potrebuje ty kulate zavorky okolo numeric_..._specialized
  64.    // jinak neni schopen to prelozit
  65.    typedef Rozhodni<TYP, (numeric_limits<TYP>::is_specialized)>::return_type
  66.       return_type;
  67. };
  68.  
  69. //
  70. //  Zde vidime, ze tridu rysu nemusime definovat jen pomoci
  71. //  explicitnich specializaci.
  72. //  Dalo by se rict, ze pouziti explicitnich specializaci je
  73. //  neco jako metoda hrube sily.
  74. //
  75. //  Pouzitim castecnych specializaci a metafunkci
  76. //  je take mozne elegantne nadefinovat tridu rysu.
  77. //  Je to vsak spise pro profiky.
  78. //
  79.  
  80. //---------------------------------------------------------------------------
  81. #pragma argsused
  82. int main(int argc, char* argv[])
  83. {
  84.    // priklad pouziti tridy rysu numeric_limits
  85.    double hodnemoc = numeric_limits<double>::has_infinity ?
  86.                      numeric_limits<double>::infinity() :
  87.                      numeric_limits<double>::max();
  88.    cout << "hodne moc je asi tolik : " << hodnemoc << endl;
  89.  
  90.    // co je numericky typ a co ne
  91.    cout << "\ndouble "
  92.         << (numeric_limits<double>::is_specialized ? "je" : "neni")
  93.         << " numericky typ";
  94.    cout << "\ncMojeTrida "
  95.         << (numeric_limits<cMojeTrida>::is_specialized ? "je" : "neni")
  96.         << " numericky typ" << endl;
  97.  
  98.    // a ted vyzkousime nasi tridu rysu
  99.    cout << "\nnumeric_maxpromote<int>::return_type = "
  100.         << typeid(numeric_maxpromote<int>::return_type).name();
  101.    cout << "\nnumeric_maxpromote<cMojeTrida>::return_type = "
  102.         << typeid(numeric_maxpromote<cMojeTrida>::return_type).name();
  103.  
  104.    // POZN: operator typeid je jedna z moznosti jak ladit metaprogramy
  105.  
  106.    return 0;
  107. }
  108.