Newsgroup: it.comp.lang.c++
Titolo: specilizzazione template

Salve,
Se volessi specilizzare una classe intera per un tipo la seguente sintassi
non dovrebbe essere giusta?
#include <iostream>
template <class T>
 struct X{};
template <int>
 struct X{};
int main() {
 return 0;
}
Mi pare molto leggibile, l'alternativa lo e' di piu'?
Grazie


Scusa ma che significa quello stai dicendo / scrivendo ? e poi
che vantaggi ci sono ad usare struct che class (solo la visibilità) ? 

 }
Cioe' la sintassi abiutale e':
#include <iostream>
template <class T>
 struct X{};
template <>
 struct X<int>{};
int main() {
 return 0;
}
Ma perche' quella da me proposta non e' accettata? Mi pare piu' chiara... ci
sono casi in cui puo' generare ambiguita'?
Grazie

 che vantaggi ci sono ad usare struct che class (solo la visibilità) ?
Ok mi rispondo da solo tutto chiaro .
passo-e-chiudo. 

 Mi pare molto leggibile, l'alternativa lo e' di piu'?
l'alternativa giusta č:
template <class T> struct X
{};
template <>
struct X<int>
{};
int main() {
  return 0;
}
anch'essa abbastanza leggibile, ma un po' meno :-)
-- 
si prepara direttamente nel bicchiere basso detto "tumbler basso". Tre o 
quattro cubetti di ghiaccio, aggiungere il gin, il martini rosso, il 
bitter campari e mescolare. Guarnire con una fetta d'arancia.

 anch'essa abbastanza leggibile, ma un po' meno :-)
Appunto dico, perche' si e' optato per questa? Potreste farmi vedere cosa
implica la mia sintassi?
Grazie

 
La tua sintassi ha già un altro significato. Infatti, la seguente
  template<int> class A { };
definisce una classe template con un parametro di tipo 'int'. 
Una possibile instanziazione è A<0>. Ad es:
    A<0> a;
Max

Noixe wrote:

allora avevo frainteso il tuo post, mi dispiace. Perchč abbiano scelto 
proprio quella sintassi? perchč quello che hai scritto tu (riporto)
template <int>
  struct X{};
puň generare confusione, ad esempio con questo:
template<int Z>
struct Buffer
{
	char data[Z];
};


     A<0> a;
Si ma non si puo' utilizzare come specilizzazione di template. In pratica ci
vorrebbe una sorta di "overload di sintassi". Ma forse renderebbe il codice
piu criptico in alcuni casi e se cosi fosse allora diventerebbe
controproducente.
Ciao


E in che modo?
con
Buffer<6> b;
semplicemente instanzio Buffer con un valore int. Quello che chiedo e' il
perche' tale sintassi non venga adottata anche nelle specilizzazione di
Buffer per gli int.
Ciao

 implica la mia sintassi?
Una sintassi non "implica" nulla.
Come ti hanno fatto notare sarebbe ambigua.
Poi di discorsi sul "sarebbe meglio" o "sarebbe peggio" (fingiamo di
supporre che l'ambiguità non esistesse) si può parlare all'infinito.
Sinceramente la stessa sintassi dei template non "mi fa impazzire", ma
funziona ed è consistente (per esempio con i cast).
Funziona.. e tanto mi basta.
Il succo è che levi paramerti templatici man mano che li specializzi.
Vedere le due <> vuote fa subito pensare ad una specializzazione, si
vede subito. 
Con  la tua sintassi invece uno dovrebbe andare a leggere dentro i campi
per capire se è una specializzazione e tutto.
-- 
[ RiK0                                ]
[ Go away! The internet is full!      ]
[ Non credo negli schemi non vincenti ]

 E in che modo?
come in che modo? Tu stai cercando di scrivere una specializzazione di 
un template allo stesso modo di un una normale template. Come li 
distingui i due casi? se vedo la definizione della classe Buffer come 
faccio a sapere se è una specializzazione oppure no? devo andarmi a 
riguardare tutta la gerarchia di inclusioni? e se ne sto definendo una 
nuova e non mi accorgo che c'è già una classe template con lo stesso nome?
-- 
There are better things in life than alcohol, but alcohol makes up for 
not having them. - Terry Pratchett.

 nuova e non mi accorgo che c'è già una classe template con lo stesso nome?
Ma lo stesso problema sorge se c'e' gia una specializzazione di una classe
con lo stesso nome. Cioe' se la classe gia esiste come normale template o se
esiste gia la specializzazione per il tipo in ogni caso non puoi definirla
nuovamente per quel tipo.
Ciao

 nuovamente per quel tipo.
non ti seguo, puoi fare un esempio di codice?


 non ti seguo, puoi fare un esempio di codice?
Volevo sempre dire, prendendo sempre ad esempio Buffer<int>, che tu
ovviamente non puoi ridefinire Buffer<int> se gia esiste, sia essa una
semplice classe template (per int) sia essa una specializzazione di Buffer
per int.
Ciao