Posted By: Neuromancer (... bright eyes ...) on 'CZprogram'
Title:     Re: templaty
Date:      Tue Jan 20 10:10:21 2004

Zdar,
  ok, mrkl jsem se na to, takze tady jsou casti celkoveho kodu (zkompiluje se 
a predpokladam, ze dela co jsi chtel, ale nevim, jak se ti bude libit).

template <int Ti> class C0int
{
public:
  enum {
    di = Ti
  };
//static const int di = Ti;
};

Stare MSVC nebere class konstanty, bezne reseni je pouziti enumu, jako jsem to 
udelal vyse.

template <typename R> class C1vret
{
  public:
    template <typename T0> R f(T0 a0) { return (R)a0; }
};

template <> class C1vret<void>
{
  public:
    template <typename T0> R f(T0 a0) { return (R)a0; }
};
MSVC6 neumi castecne specializace sablon, pouze uplne. Resenim tedy je bud
udelat uplne specializace pro vsechny pripady R,T0, ktere pripadaj v uvahu,
nebo to v nekterych pripadech implementovat pomoci zanorenych sablon jako
ja vyse (pouzil jsem uvnitr sablonu funkce, ale zrovna tak bys mohl pouzit
zanorenou tridu).

C2ref - ta cast s referenci neprojde. MSVC6 nerozlisuje pri definici sablon
T a T&. Jestli to chces nejak obejit, mrkni na zdrojaky BOOSTu, tusim to
tak bylo nejakym hackem resene.

C3out - tu externi definici metody jsem nerozchodil, porad se mu neco nezdalo.
Nicmene obecne ta syntax vypada takto:
template <typename T0, typename TB>
C4B<TB> *C4A<T0>::f(TB*)
{
        return new C4B<TB>;
}
(sorry ze jsem pouzil c4b, tu c3out uz jsem si smazal). Tj. misto, abys 
spravne napsal template<> 2x po sobe, musis to dat dohromady. Nicmene
projde to jen nekdy (tu funkci u C4B jsem take nerozchodil, musel jsem
ji dat inline.

template <typename T0>
class C4A
{
public:
  template <typename TB> C4B<TB> *f(TB*) { return new C4B<TB>; };
};
MSVC6 nesezere explicitni specifikaci parametru u templated funkce (jako
jsi pouzil ty,  c4a.f<double>(...) ). Musi si zvladnout odvodit parametry
sam. Muzes tudiz pouzit vyse uvedeneho triku a pak tu funkci volat takto:
c4a.f( (double*)0 );

Pokud nepotrebujes volat funkci pres instanci, je alternativou pouzit
zanorene tridy a staticke funkce, jako napriklad takto:
template <typename T0>
class C5{
public:
  template <typename TA> class C5i{
public:
  static C4A<TA>* f() { return new C4A<TA>; }
  };
};

A pak volani:
        C5<short>::C5i<double>::f();
(hodi se dat tomu C5i nejake lepsi jmeno, aby ten zapis daval alespon trochu 
smysl).

Mno, takze jak jsem rikal, rozchodit to jde, ale s obtizema. Obcas se to
vyplati (mam udelane sablony na univerzalni type-safe callbacky a zkompiluji
se mi i pro MSVC6, i kdyz jsem v nich nerozchodil vse co jsem puvodne
chtel), nicmene pokud mas moznost, zkus ignorovat vse od M$ pres .net2003,
usetris si tim hodne nervu.
P.S. url na boost je tu:
http://www.boost.org/
Velka cast se korektne zkompiluje i pod MSVC6 za coz pred autory smekam...
 
--------------------------------------------------------------------/
|       ICQ 20529980                               Neuromancer       |
|              Take me far away, where the dragons fly,              |
/------------ leave me to my dreams, or just let me die. ------------

Search the boards