I always knew C++ templates were the work of the Devil,
and now I'm sure...
- Cliff Click cited by Todd Veldhuisen
Your quote here.
- B. Stroustup
// maximum függvény
int max( int a, int b)
{
if ( a > b )
return a;
else
return b;
}
double max( double a, double b)
{
if ( a > b )
return a;
else
return b;
}
// ... és így tovább ...
// de mi van azokkal a típusokkal, amiket még nem írtunk meg?
// pl. max( date, date)
// Preprocessor Macro
#define MAX(a,b) a > b ? a : b
MAX( x, y)*2 --> x > y ? x : y*2
#define MAX(a,b) ((a) > (b) ? (a) : (b))
MAX( ++x, y) --> ++x > y ? ++x : y
// sajnos nem mindig működik, mert a C++ makró típustalan
void swap( int& x, int& y)
{
int temp = x; // mi lesz x típusa?
x = y;
y = temp;
}
template <typename T>
void swap( T& x, T& y)
{
T temp = x;
x = y;
y = temp;
}
template <class T>
T max( T a, T b)
{
if ( a > b )
return a;
else
return b;
}
// a függvény template nem függvény, hanem egy gyártási eljárás!
// a példányosítás (általában) automatikus:
double x, y = 5.1, z = 3.14;
x = max( y, z);
// template paraméter lehet skalár is:
template <class T, T defval>
class C
{
T t[defval];
//...
}
C<int,10> c;
A template paraméter lehet:
- konstans kifejezés
- külső szerkesztésű objektum vayg függvény címe
- (nem túlterhelt) tagra mutató pointer
// típus ekvinalencia:
C<char,10> c1;
C<int, 10> c2; // más típus, mint c1
C<int, 25-15> c3; // ugyanaz a típus, mint c2
// Példányosítás, paraméter dedukció:
int i = 3, j = 4, k;
double x = 3.14, y = 4.14, z;
const int ci = 6;
k = max( i, j); // -> max(int, int)
z = max( x, y); // -> max(double, double)
k = max( i, ci); // -> max(int, int)
z = max( i, x); // -> hiba
template <class T, class S>
T max( T a, S b)
{
if ( a > b )
return a;
else
return b;
}
int i = 3;
double x = 3.14;
z = max( i, x); // ok, de..
z == 3.0 // ??
// a paraméter dedukció fordítási időben történik
template <class R, class T, class S>
R max( T a, S b)
{
if ( a > b )
return a;
else
return b;
}
z = max( i, x); // error, a visszatérő értéken nem lehet
// kikövetkeztetni a paraméter (R) típusát
// nem túl elegáns, de működik:
template <class R, class T, class S>
R max( T a, S b, R)
{
if ( a > b )
return a;
else
return b;
}
z = max( i, x, 0.0); // ok, but ugly and misleading
Explicit specializáció
// elegáns:
template <class R, class T, class S>
R max( T a, S b)
{
if ( a > b )
return a;
else
return b;
}
z = max<double>( i, x); // ok, visszatér: 3.14
k = max<long, long, int>( i, x); // long-ra és int-re konvertál
k = max<int, int, int>( i, j); // ok, de felesleges
Template overloading
template <class T> T max(T,T);
template <class R, class T, class S> R max(T,S);
Felhasználói specializáció (User specializations)
char *s1 = "Hello";
char *s2 = "world";
cout << max( s1, s2); // ??
template <>
const char *max<const char *>( const char *s1, const char *s2)
{
return strcmp( s1, s2) < 0;
}
// vagy rövidebben:
template <> const char *max( const char *s1, const char *s2) ...