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

Specijalizacija templejta

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

[ Pregleda: 2847 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

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



+9 Profil

icon Specijalizacija templejta16.11.2007. u 12:32 - pre 200 meseci
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?
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

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



+4 Profil

icon Re: Specijalizacija templejta16.11.2007. u 13:14 - pre 200 meseci
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.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

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

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Specijalizacija templejta17.11.2007. u 19:04 - pre 200 meseci
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
 
Odgovor na temu

1jedini
Dejan Milosavljevic
BG

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



Profil

icon Re: Specijalizacija templejta18.11.2007. u 12:07 - pre 200 meseci
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
 
Odgovor na temu

Goran Arandjelovic
Beograd

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



+9 Profil

icon Re: Specijalizacija templejta23.11.2007. u 09:18 - pre 200 meseci
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.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Specijalizacija templejta23.11.2007. u 20:19 - pre 200 meseci
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
 
Odgovor na temu

tosa
上海, 中国

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

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Specijalizacija templejta24.11.2007. u 14:38 - pre 200 meseci
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.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

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

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Specijalizacija templejta25.11.2007. u 04:59 - pre 200 meseci
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
 
Odgovor na temu

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

[ Pregleda: 2847 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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