home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////////
- //
- // soubor: numerika.cpp
- // projekt: Sablony v C++ - specializace trochu jinak
- // autor: Jaroslav Franek
- // (c) 2000 Jaroslav Franek
- //
- // Tridy rysu
- // informace o numerickych typech
- // std::numeric_limits, numeric_maxpromote
- //
- // Poznamka: take se dozvite, ze tridu rysu lze definovat
- // pomoci metafunkce a jak se ladi metaprogramy
- //
- ////////////////////////////////////////////////////////////////////////////
-
- #pragma hdrstop
- #include <condefs.h>
-
- #include <iostream>
- #include <limits>
-
- using namespace std;
-
- //
- // nejaka trida, ktera nema s numerickym typem nic spolecneho
- //
- class cMojeTrida
- {
- };
-
- //
- // Je na case zkusit neco slozitejsiho
- //
- // trida rysu numeric_maxpromote
- //
- // O co jde: pro numericke typy provede rozsireni
- // na maximalni moznou presnost (long double)
- // pro ostatni typy neprovede nic
- // Vlastne to bude implementovano jako metafunkce
- // vstupni parametr je nejaky typ
- // vystupem je take typ
- //
-
- //
- // pomocna trida, (take metafunkce)
- //
- template <class TYP, bool B> struct Rozhodni
- {
- typedef TYP return_type;
- };
-
- // parcialni specializace
- template <class TYP> struct Rozhodni<TYP, true>
- {
- typedef long double return_type;
- };
-
- // a nyni uz slibena trida rysu
- template <class TYP> struct numeric_maxpromote
- {
- // POZN: je to mensi zahada, ale Borland C++ Builder 4.0
- // potrebuje ty kulate zavorky okolo numeric_..._specialized
- // jinak neni schopen to prelozit
- typedef Rozhodni<TYP, (numeric_limits<TYP>::is_specialized)>::return_type
- return_type;
- };
-
- //
- // Zde vidime, ze tridu rysu nemusime definovat jen pomoci
- // explicitnich specializaci.
- // Dalo by se rict, ze pouziti explicitnich specializaci je
- // neco jako metoda hrube sily.
- //
- // Pouzitim castecnych specializaci a metafunkci
- // je take mozne elegantne nadefinovat tridu rysu.
- // Je to vsak spise pro profiky.
- //
-
- //---------------------------------------------------------------------------
- #pragma argsused
- int main(int argc, char* argv[])
- {
- // priklad pouziti tridy rysu numeric_limits
- double hodnemoc = numeric_limits<double>::has_infinity ?
- numeric_limits<double>::infinity() :
- numeric_limits<double>::max();
- cout << "hodne moc je asi tolik : " << hodnemoc << endl;
-
- // co je numericky typ a co ne
- cout << "\ndouble "
- << (numeric_limits<double>::is_specialized ? "je" : "neni")
- << " numericky typ";
- cout << "\ncMojeTrida "
- << (numeric_limits<cMojeTrida>::is_specialized ? "je" : "neni")
- << " numericky typ" << endl;
-
- // a ted vyzkousime nasi tridu rysu
- cout << "\nnumeric_maxpromote<int>::return_type = "
- << typeid(numeric_maxpromote<int>::return_type).name();
- cout << "\nnumeric_maxpromote<cMojeTrida>::return_type = "
- << typeid(numeric_maxpromote<cMojeTrida>::return_type).name();
-
- // POZN: operator typeid je jedna z moznosti jak ladit metaprogramy
-
- return 0;
- }
-