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