Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Specijalizacija templejta

[es] :: C++ programiranje :: Specijalizacija templejta

[ Pregleda: 745 | Odgovora: 7 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 248
*.dynamic.sbb.co.yu.

Jabber: goranche@elitesecurity.org


Profil

icon Specijalizacija templejta16.11.2007. u 12:32

Da li je ovo u Standardu dozvoljeno:

Code:

struct NekiTip{};
struct NekiTip2{};

template<typename T>
struct A
{
  template<typename S>
  struct B { S x; };

  template<>
  struct B<NekiTip> { NekiTip2 x; };  // neka specijalizacija, nije bitno kakva...

  B<int> p;
};


Naime, VC++2005 ovo kompajlira bez problema dok gcc 3.4.2 ovo ne prolazi... Da li gcc jednostavno ne podrzava specijalizaciju nekog templejta unutar postojeceg ili je nesto drugo u pitanju?
16.11.2007. u 12:32 

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 870
*.demon.co.uk.

Sajt: www.frd.co.uk


Profil

icon Re: Specijalizacija templejta16.11.2007. u 13:14
Uh, to je klizava zona :)

Koliko se secam (nemam vremena da preteram po dokumentaciji) gcc je u pravu i kazhe ti da ne mozhesh da specijalizujesh template na non-namespace nivou (shto je po standardu).
U prevodu, ne mozesh da izvrshish tu specijalizaciju u okviru same klase (ali mozhesh parcijalnu, shto tebi i nije korisno). Moracesh da tu specijalizaciju izbacish van klase.
"The rational prisoner exploits the weak places, creates order from chaos: instead, collectives like the FSF vindicate their jailers by building cells almost compatible with the existing ones, albeit with more features."
16.11.2007. u 13:14 

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 322
*.fibertel.com.ar.



Profil

icon Re: Specijalizacija templejta17.11.2007. u 19:04
NastyBoy je u pravu.

Ono što možeš da uradiš je sledeće:

Code:

#include <iostream>

struct NekiTip {     };
struct NekiTip2{     };

template<typename T>
struct A
{
  template<typename S, int dummy>
  struct B { B() : x(S()) {} S x; };

  template < int N >
  struct B<NekiTip, N> { NekiTip2 x; };  // neka specijalizacija, nije bitno kakva...

  B<int,3> p;
};


int main(void) {
  A<int> a;
  std::cout << a.p.x << std::endl;
  return 0;
}


Puna specijalizacija templejta unutar klase neće raditi na većini kompajlera a i standard to ne dopušta. Ono što je moguće je parcijalna specijalizacija iz dva prolaza. Dodaš jedan celobrojni parametar čisto da bi parcijalna specijalizacija bila moguća i eto rešenja.

Inače nikad ne treba uzimati samo jedan kompajler kao referencu. Kod je poželjno isprobati na više njih. Tvoj originalni kod mogu da prevedu samo intelov i microsoftov kompajler (verzija 8).

Tko leti vrijedi
17.11.2007. u 19:04 

1jedini
Dejan Milosavljevic
BG

Član broj: 102721
Poruke: 62
*.cpe.vektor.net.

Sajt: www.ddmrm.com


Profil

icon Re: Specijalizacija templejta18.11.2007. u 12:07
Da potvrdim predhodno navedeno.

Za eskplicitne specijalizacije stvar je cista:

Citat:

14.7.3.1
2 — An explicit specialization shall be declared in the namespace of which the template is a member, or, for
member templates, in the namespace of which the enclosing class or enclosing class template is a member.
An explicit specialization of a member function, member class or static data member of a class template
shall be declared in the namespace of which the class template is a member. ...


Ako mora ( shall be ) u namespace-u onda ne moze van jer bi bilo multiple declaration.



Za delimicne je malko mutno:

Citat:

14.5.4
6 — A class template partial specialization may be declared or redeclared in any namespace scope in which its
definition may be defined (14.5.1 and 14.5.2). ...


Da su mesto may be stavili shall be, pa da bude potpuno odredjeno.
Ovako ne zvuci da samo tu mora.

I Working Draft (Doc No: N2461=07-0331, Date: 2007-10-22 ) kaze isto.




AKA DDMM
18.11.2007. u 12:07 

Goran Arandjelovic
Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 248
*.rcub.bg.ac.yu.

Jabber: goranche@elitesecurity.org


Profil

icon Re: Specijalizacija templejta23.11.2007. u 09:18
Hvala na odgovorima.. ono što ostaje je da se čovek pita šta da radi kada je u pitanju template metaprogramiranje, jer se u samom startu mora voditi računa koji kompajler koliko poštuje Standard kako bi kod bio uvek (ili u što većem broju slučajeva) portabilan.
23.11.2007. u 09:18 

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 322
200.49.157.*



Profil

icon Re: Specijalizacija templejta23.11.2007. u 20:19
Citat:
Goran Arandjelovic: Hvala na odgovorima.. ono što ostaje je da se čovek pita šta da radi kada je u pitanju template metaprogramiranje, jer se u samom startu mora voditi računa koji kompajler koliko poštuje Standard kako bi kod bio uvek (ili u što većem broju slučajeva) portabilan.


Za te slucajeve postovanja/nepostovanja standarda postoji #ifdef direktiva

Tko leti vrijedi
23.11.2007. u 20:19 

tosa

Član broj: 1811
Poruke: 1247
..w.sh.dynamic.163data.com.cn.



Profil

icon Re: Specijalizacija templejta24.11.2007. u 14:38
Citat:
kiklop74: Za te slucajeve postovanja/nepostovanja standarda postoji #ifdef direktiva

To je prilično loša praksa koja ostavlja solidnu količinu "prljavog" koda.
Najbolje je naći portabilno rešenje ili napisati kod tako da nema problema sa standardima.
Ako se nagomilaju #ifdef-ovi, održavanje postaje dosta nezgodno.

Soylent green: over 6 billion served!
24.11.2007. u 14:38 

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 322
*.fibertel.com.ar.



Profil

icon Re: Specijalizacija templejta25.11.2007. u 04:59
Citat:
tosa: To je prilično loša praksa koja ostavlja solidnu količinu "prljavog" koda.
Najbolje je naći portabilno rešenje ili napisati kod tako da nema problema sa standardima.
Ako se nagomilaju #ifdef-ovi, održavanje postaje dosta nezgodno.

Tako je. I tako se radi kada je to moguce. Na zalost, uvek ima i onih drugih situacija.
Tko leti vrijedi
25.11.2007. u 04:59 

[es] :: C++ programiranje :: Specijalizacija templejta

[ Pregleda: 745 | Odgovora: 7 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.