[ DDMM @ 16.09.2004. 17:55 ] @
Evo primera:
Code:

#include <iostream>
#include <iomanip>

using namespace std;

template < typename _Ta, typename _Tb >
 class MojaKlasa
  {
   public:
    MojaKlasa(){}

   void f( void )  
    {
     cout << "Opsta" << endl;
    }

  };

template < >
 void MojaKlasa<int,int>::f( void ) // potpuno specijalizovana. OK.
  {
   cout << "int,int" << endl; 
  }


// ovo hocu ali nece. 
template < typename _Ta>
 void MojaKlasa<_Ta,int>::f( void )
  {
   cout << "_Ta,int" << endl;
  }


int main()
 {
  MojaKlasa<float,float> ff;   ff.f(); // opsta ide.    
  MojaKlasa<int,int> ii;   ii.f();     // totalna ide.
  MojaKlasa<void,int> vi;  vi.f(); // treba da ispise: "_Ta,int", ali kompajler odbija da prevede.
  cin.get();

  return 0;
 }
[ filmil @ 16.09.2004. 18:00 ] @
Možda ti pomaže saznanje da GCC ne podržava delimičnu specijalizaciju?

f
[ Dragi Tata @ 16.09.2004. 20:06 ] @
Delimična specijalizacija šablon funkcija (kako članica tako i ne-članica) nije predviđena standardom, mada je predložena za iduće izdanje standarda.

Inače, verujem da je Filip mislio da gcc ne podržava delimičnu specijalizaciju funkcija. gcc 3.3 na SFU 3.5 sasvim lepo prevede sledeći kod:

Code:

template<typename T1, typename T2>
class moja{};

template<typename T>
class moja<T,int> {};

int main()
{}
[ DDMM @ 17.09.2004. 18:03 ] @
Citat:

Možda ti pomaže saznanje da GCC ne podržava delimičnu specijalizaciju

Zaboravih da kazem. Koristio sam i VC7 i GCC 3.3.1.
Jedan i drugi se bune.

Citat:

Delimična specijalizacija šablon funkcija (kako članica tako i ne-članica) nije predviđena standardom, mada je predložena za iduće izdanje standarda.

Steta. Nije mi jasno zasto to nisu ubacili.

Od Slobodnih funkcije je lako napraviti delimicnu specijalizaciju.
Mesto da uradim funkciju napravim funktor. Sto sam na mnogo mesta i radio.
... ali mnogo je lepse delimicno specijalizovati.

I na kraju evo 'resenja' (provereno na GCC-u):
Pre delimicne specijalizacije treba ubaciti:

Code:

template < typename _Ta >
 class MojaKlasa< _Ta,int >
  {
      public:
          MojaKlasa(){}
          void f( void ) ;
      
  };

I to prema 14.5.4.3 Members of class template specializations.

Bas ruzno. copy/paste mora da radi.
[ leka @ 01.10.2004. 14:34 ] @
IT industrija je cudo - ubi terminima - da li je "delimicna specijalizacija" isto sto i "partial revelation" ? :)
[ filmil @ 01.10.2004. 14:43 ] @
Citat:
IT industrija je cudo - ubi terminima - da li je "delimicna specijalizacija" isto sto i "partial revelation" ? :)
Mislim da nije. Evo primer za delimičnu specijalizaciju.

Zamisli da imaš šablon koji zavisi od dva tipa, recimo A i B. Ako staviš: A:=int, B:=char, dobio si potpunu specijalizaciju, jer kompajler može da zameni A sa int, B sa char i da ti proizvede tip koji si tražio.

Kod delimične specijalizacije staviš samo A:=int i tražiš od kompajlera da ti proizvede šablon koji sad zavisi samo od jednog parametra.

Partial revealation ti je mogućnost da ceo interfejs podeliš na nekoliko manjih i onda te manje interfejse daješ samo klijentima (klasama) koji će stvarno da ih koriste.

f
[ Dragi Tata @ 01.10.2004. 15:13 ] @
Delimična specijalizacija se posebno koristi kod meta-programiranja. Toplo preporučujem knjigu: http://www.moderncppdesign.com/

Recimo za liste tipova:

Code:

template <class T, class U>
struct TypeList {
typedef T Head;
typedef U Tail;
};


Evo kako bi se računala dužina liste rekurzijom (obratite pažnju da se sve to dešava prilikom kompajliranja, a ne izvršavanja):

Code:

class NullType {};
template <class TList> struct Length;

//potpuna specijalizacija:
template <> struct Length <NullType> {   
enum { value = 0 };
};

//delimicna specijalizacija:
template <class T, class U>
struct Length<TypeList<T, U> > {
enum {value = 1 + Length<U>::value};
};