home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////////
- //
- // soubor: polymorf.cpp
- // projekt: Sablony v C++ - specializace trochu jinak
- // autor: Jaroslav Franek
- // (c) 2000 Jaroslav Franek
- //
- // Tridy rysu
- // polymorfismus v dobe prekladu
- // prevod objektu na retezec
- //
- // Poznamka: V praxi se prevod na retezec dela jinak, napr.
- // s pouzitim objektovych datovych proudu (std::ostringstream)
- // Zde slo pouze o demonstraci "polymorfismu" v dobe prekladu.
- //
- ////////////////////////////////////////////////////////////////////////////
-
- #pragma hdrstop
- #include <condefs.h>
- #include <iostream>
- #include <math>
-
- using namespace std;
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // trida rysu
- //
- ////////////////////////////////////////////////////////////////////////////
-
- // primarni sablona
- template <class TYP> struct PrevedNaRetezec
- {
- static void prevod(TYP a, char * buff); // deklarovana ale nedefinovana
- }; // chybu v (*) zachyti linker;
- // pokud tuto deklaraci odstranime,
- // zachyti chybu v (*) uz prekladac
-
- // explicitni specializace pro TYP == char
- // retezec prevedeme snadno - jde jen o kopirovani
- template <> struct PrevedNaRetezec<char *>
- {
- static void prevod(char * src, char * buff)
- {
- strcpy(buff, src);
- }
- };
-
- // pro cele cislo pouzijeme konverzni funkci
- template <> struct PrevedNaRetezec<int>
- {
- static void prevod(int a, char * buff)
- {
- itoa(a, buff, 10); // 10 = zaklad ciselne soustavy
- }
- };
-
- // pro racionalni cislo (double) pouzijeme jinou konverzni funkci
- template <> struct PrevedNaRetezec<double>
- {
- static void prevod(double a, char * buff)
- {
- gcvt(a, 12, buff); // 12 = pocet platnych cifer
- }
- };
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // tohle by mela byt hodne slozita funkce (vyzaduje to trochu predstavivosti)
- //
- ////////////////////////////////////////////////////////////////////////////
-
- template <class TYP>
- void HodneSlozitaFunkce(TYP a)
- {
- // neco hodne sloziteho
- // ...
-
- // formatovaci buffer,
- // velikost bufferu by nam mela stacit
- char buff[40];
-
- // pouziti tridy rysu
- PrevedNaRetezec<TYP>::prevod(a, buff);
-
- // no a zde si nechame vypsat, jak dopadl prevod
- cout << '\n' << buff;
-
- // ...
- // neco hodne sloziteho
- }
-
- //---------------------------------------------------------------------------
- #pragma argsused
- int main(int argc, char* argv[])
- {
- int a = 5;
- double pi = M_PI;
- char * retezec = "Hasta la vista, baby!";
-
- HodneSlozitaFunkce(a);
- HodneSlozitaFunkce(pi);
- HodneSlozitaFunkce(retezec);
-
- float f = 3.0;
- // a tohle by nemelo projit
- // HodneSlozitaFunkce(f); // (*), umyslna chyba
- // a taky ze to neproslo
-
- return 0;
- }
-
-