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/

Search the boards