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/