home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 February
/
Chip_2001-02_cd1.bin
/
chplus
/
poly
/
soucet3.cpp
< prev
Wrap
C/C++ Source or Header
|
2001-01-03
|
2KB
|
79 lines
////////////////////////////////////////////////////////////////////////////
//
// soubor: soucet3.cpp
// projekt: Sablony v C++ - specializace trochu jinak
// autor: Jaroslav Franek
// (c) 2000 Jaroslav Franek
//
// Tridy rysu
// funkce soucet - pokus 3 s vyuzitim tridy rysu
//
////////////////////////////////////////////////////////////////////////////
#pragma hdrstop
#include <condefs.h>
#include <iostream>
////////////////////////////////////////////////////////////////////////////
//
// trida rysu (traits-class), ktera urcuje vysledny typ souctu
//
////////////////////////////////////////////////////////////////////////////
// primarni sablona
template <class LEVY, class PRAVY> struct VysledekPlus {};
// explicitni specializace pro int + short
template <> struct VysledekPlus<int, short>
{
typedef int typ;
};
// explicitni specializace pro double + int
template <> struct VysledekPlus<double, int>
{
typedef double typ;
};
// explicitni specializace pro int + double
template <> struct VysledekPlus<int, double>
{
typedef double typ;
};
// zkusime si pomoct makrem
#define VYSL(a,b,c) template <> struct VysledekPlus<a, b > { typedef c typ; }
VYSL(short, int, int);
VYSL(int, int, int);
// atd...
// zde se omezime jen na nekolik specializaci
////////////////////////////////////////////////////////////////////////////
//
// definice funkce soucet s vyuzitim tridy rysu
//
////////////////////////////////////////////////////////////////////////////
template <class LEVY, class PRAVY>
typename VysledekPlus<LEVY, PRAVY>::typ soucet(LEVY levy, PRAVY pravy)
{
typedef typename VysledekPlus<LEVY, PRAVY>::typ result_t;
return result_t(levy + pravy);
}
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
int a = 3;
short c = 5;
// nyni uz bez problemu
int b = soucet(a, c);
std::cout << '\n' << b;
return 0;
}