Posted By: Rat (prilis mnoho her) on 'CZprogram'
Title: Re: templatyy
Date: Mon Jan 19 14:09:25 2004
> Caues,
> sveho casu jsem si se sablonama celkem hodne hral a asi bych se mohl
> pokusit
> donutit ten kompilator nejak to sezrat, ale potreboval bych kompletnejsi
> kod.
> Nicmene bylo spoustu pripadu, kdy jsem MSVC proste nedonutil zkompilovat
> metodu tridy mimo definici tridy. Plus ruzne podivne padani kterym pomuze
> prohozeni 2 metod etc etc.. celkem smrt. Na castecne specializace muzes
> prakticky zapomenout.
> Ovsem pokud mas moznost, sezen si MSVC .NET 2003 (ne ty predchozi!), ty uz
> umi se sablonama prakticky vse.
Dobra, lehce vycisteny kod je zde (ted presne nevim, co z toho nebude
fungovat, ale krome jedne veci nejspis nic (este to pak jednou zkusim, az se
dostanu ke stroji s windos)):
#include <stdio.h>
template <int Ti> class C0int
{
public:
static const int di = Ti;
};
template <typename R, typename T0> class C1vret
{
public:
R f(T0 a0) { return (R)a0; }
};
template <typename T0> class C1vret<void, T0>
{
public:
void f(T0 a0) { }
};
template <typename T> class C2ref
{
public:
typedef T &ref;
};
template <typename T> class C2ref<T &>
{
public:
typedef T &ref;
};
template <> class C2ref<void>
{
public:
typedef char &ref;
};
template <typename R> class C3out
{
public:
template <typename T0>
R f(T0 a0);
};
template <typename R> template <typename T0>
R C3out<R>::f(T0 a0)
{
return a0;
}
template <typename T0> class C4B;
template <typename T0>
class C4A
{
public:
template <typename TB> C4B<TB> *f();
};
template <typename T0>
class C4B
{
public:
template <typename TA> C4A<TA> *f() { return new C4A<TA>; }
};
template <typename T0> template <typename TB>
C4B<TB> *C4A<T0>::f()
{
return new C4B<TB>;
}
int main(void)
{
// C0int:
C0int<5> c0int5;
C0int<c0int5.di+1> c0int6;
// C1vret:
C1vret<int, double> c1vret0; printf("%dn", c1vret0.f(6.0));
C1vret<void, double> c1vret1;
// C2ref:
printf("d: %d, r: %d, v: %dn", sizeof(C2ref<double>::ref),
sizeof(C2ref<short &>::ref), sizeof(C2ref<void>::ref));
// C3out:
C3out<int> c3out0; printf("%d, %dn", c3out0.f<double>(7.0),
c3out0.f(89.0f));
// C4A:
C4A<short> c4a; printf("%pn", c4a.f<double>());
return 0;
}
> --------------------------------------------------------------------/
> | ICQ 20529980 Neuromancer |
> | Take me far away, where the dragons fly, |
> /------------ leave me to my dreams, or just let me die. ------------
Zatim dik, na to MSVC 2003 snad este mrknu...
Krysa
rat@atrey.karlin.mff.cuni.cz Jsem Krysa
http://atrey.karlin.mff.cuni.cz/~rat/