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