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

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //   soubor:  polymorf.cpp
  4. //   projekt: Sablony v C++ - specializace trochu jinak
  5. //   autor:   Jaroslav Franek
  6. //   (c) 2000 Jaroslav Franek
  7. //
  8. //   Tridy rysu
  9. //      polymorfismus v dobe prekladu
  10. //         prevod objektu na retezec
  11. //
  12. //   Poznamka: V praxi se prevod na retezec dela jinak, napr.
  13. //             s pouzitim objektovych datovych proudu (std::ostringstream)
  14. //             Zde slo pouze o demonstraci "polymorfismu" v dobe prekladu.
  15. //
  16. ////////////////////////////////////////////////////////////////////////////
  17.  
  18. #pragma hdrstop
  19. #include <condefs.h>
  20. #include <iostream>
  21. #include <math>
  22.  
  23. using namespace std;
  24.  
  25. ////////////////////////////////////////////////////////////////////////////
  26. //
  27. //  trida rysu
  28. //
  29. ////////////////////////////////////////////////////////////////////////////
  30.  
  31. // primarni sablona
  32. template <class TYP> struct PrevedNaRetezec
  33. {
  34.    static void prevod(TYP a, char * buff);  // deklarovana ale nedefinovana
  35. };                                          // chybu v (*) zachyti linker;
  36.                                             // pokud tuto deklaraci odstranime,
  37.                                             // zachyti chybu v (*) uz prekladac
  38.  
  39. // explicitni specializace pro TYP == char
  40. // retezec prevedeme snadno - jde jen o kopirovani
  41. template <> struct PrevedNaRetezec<char *>
  42. {
  43.    static void prevod(char * src, char * buff)
  44.    {
  45.       strcpy(buff, src);
  46.    }
  47. };
  48.  
  49. // pro cele cislo pouzijeme konverzni funkci
  50. template <> struct PrevedNaRetezec<int>
  51. {
  52.    static void prevod(int a, char * buff)
  53.    {
  54.       itoa(a, buff, 10);   // 10 = zaklad ciselne soustavy
  55.    }
  56. };
  57.  
  58. // pro racionalni cislo (double) pouzijeme jinou konverzni funkci
  59. template <> struct PrevedNaRetezec<double>
  60. {
  61.    static void prevod(double a, char * buff)
  62.    {
  63.       gcvt(a, 12, buff);  // 12 = pocet platnych cifer
  64.    }
  65. };
  66.  
  67. ////////////////////////////////////////////////////////////////////////////
  68. //
  69. //  tohle by mela byt hodne slozita funkce (vyzaduje to trochu predstavivosti)
  70. //
  71. ////////////////////////////////////////////////////////////////////////////
  72.  
  73. template <class TYP>
  74. void HodneSlozitaFunkce(TYP a)
  75. {
  76.    // neco hodne sloziteho
  77.    // ...
  78.  
  79.    // formatovaci buffer,
  80.    // velikost bufferu by nam mela stacit
  81.    char buff[40];
  82.  
  83.    // pouziti tridy rysu
  84.    PrevedNaRetezec<TYP>::prevod(a, buff);
  85.  
  86.    // no a zde si nechame vypsat, jak dopadl prevod
  87.    cout << '\n' << buff;
  88.  
  89.    // ...
  90.    // neco hodne sloziteho
  91. }
  92.  
  93. //---------------------------------------------------------------------------
  94. #pragma argsused
  95. int main(int argc, char* argv[])
  96. {
  97.    int a = 5;
  98.    double pi = M_PI;
  99.    char * retezec = "Hasta la vista, baby!";
  100.  
  101.    HodneSlozitaFunkce(a);
  102.    HodneSlozitaFunkce(pi);
  103.    HodneSlozitaFunkce(retezec);
  104.  
  105.    float f = 3.0;
  106.    // a tohle by nemelo projit
  107. //   HodneSlozitaFunkce(f);         // (*), umyslna chyba
  108.    // a taky ze to neproslo
  109.  
  110.    return 0;
  111. }
  112.  
  113.