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

Che sintassi dovrei usare per avere una classe template per il tipo T e due 
specializzazioni, una per int e una per il numero 1?
Cosi non funziona:
template <typename T>
class C {
      public :
             C() {
                 std::cout << "T" << std::endl;
             }
};
template <>
class C <int>  {
      public :
             C() {
                 std::cout << "int" << std::endl;
             }
};
template <>
class C <1> {
      public :
             C () {
               std::cout << "1" << std::endl;
             }
};
Saluti 

    class C <1> {
Questa non � una specializzazione del template iniziale: '1' non � un
typename, � una costante. 
Max

 typename, � una costante.
Ma dato che questo funziona:
template <int>
class C {
      public :
             C() {
                 std::cout << "int" << std::endl;
             }
};
template <>
class C <1> {
      public :
             C () {
               std::cout << "1" << std::endl;
             }
};
Non si possono ottenere una specializzazione per tipo e una per costante? 

 Cosi non funziona:
"non funziona" non e' un messaggio di errore del compilatore. :)
-- 
-riko

 
io ricordo che si possono "specializzare" (ma sulla 
correttezza del termine ci torno poi) dei template per 
valori costanti (integral o cmq enum) se dichiari come 
parametro un tipo integral o una enom, e poi "istanzi" con 
un VALORE specifico.
Ma mi sembra che tu voglia fare entrambe le cose, con una 
sintassi mista.
Sono indeciso se, nel caso che cito, si debba parlare di 
specializzazione o di istanziazione ... E' vero che si 
generano tipi a tutti gli effetti distinti anche per il solo 
valore numerico della costante, ma la procedura per 
specializzare nel caso assomiglia a una normale definizione 
(per questo sono indeciso se usare istanziare, o forse 
meglio definire / dichiarare).
Cmq non so se e come si possa fare quel che vuoi
ciao
Soviet

 "non funziona" non e' un messaggio di errore del compilatore. :)
Siccome ero certo che ci fosse qualche errore sintattico che qualcuno 
avrebbe individuato immediatamente, non ho riportato l'errore. Comunque 
eccolo(tra parentesi le righe):
3 template parameter `class T'
12 redeclared here as `int <anonymous>'
12 redefinition of `class C<T>'
4 previous definition of `class C<T>'
20 type/value mismatch at argument 1 in template parameter list for 
`template<class T> class C'
20 expected a type, got `1'
Il sorgente lo posto di nuovo con il numero di riga che interessa a fianco:
#include <iostream>
template <typename T> // 3
class C { // 4
      public :
             C() {
                 std::cout << "T" << std::endl;
             }
};
template <int>
class C { // 12
      public :
             C() {
                 std::cout << "int" << std::endl;
             }
};
template <>
class C <1> { // 20


 Non si possono ottenere una specializzazione per tipo e una per costante?
No. Una specializzazione � un'implementazione speciale per uno dei possibili
valori che il parametro del template (nella sua definizione di base) pu�
assumere. Se � il paramentro del template � un typename, i possibili valori
sono solo dei typename, e non delle costanti.  
Max

 sono solo dei typename, e non delle costanti.
Ci avevo pensato, ma pensavo anche che in qualche modo la specializzazione 
parziale per la classe iniziale potesse essere vista come la classe iniziale 
per un altra specializzazione. 

 caso assomiglia a una normale definizione
Non direi. La specializzazione usa questa sintassi:
template <>
class C <1> {
      public :
             C () {
               std::cout << "1" << std::endl;
             }
};
La classica definizione di una classe non ammette questa sintassi.

 class C <1> { // 20
-- 
-riko

 cosa che andrebbe specializzata con un tipo.
Infatti cercavo un modo per fargli capire che la specializzazione doveva 
essere riferita alla classe a sua volta specializzata per int... va b�, ero 
curioso di provare se era possibile qualcosa di simile.
Saluti 

 tutti i modi.
In C++ ti sarai accorto che andare per tentativi non funziona. E se
anche funziona, sarebbe comunque rischioso.
Hanno inventato e scritto ampli manuali. Suggerisco di utilizzarli.
-- 
-riko

 Hanno inventato e scritto ampli manuali. Suggerisco di utilizzarli.
Si, ma anche in questo caso, dipende da quello che devi fare. 

 Si, ma anche in questo caso, dipende da quello che devi fare. 
Certo. Schiacciando tasti a caso *potresti* comporre il programma che
cambiara' il mondo. :)
-- 
-riko

 cambiara' il mondo. :)
Hihihi, mi hai fatto venire in mente una cosa a cui pensavo tempo fa:
Esiste qualcuno in grado di scrivere una formula matematica in grado a sua 
volta di generare i codici ASCII dei caratteri tali da creare un sorgente di 
un programma non banale?
Chiss� se qualcuno ci hai mai provato?
Per la serie "oltre i confini delle seghe mentali". 

 di un programma non banale?
va bene il lambda calcolo?
-- 
By ZeD

 va bene il lambda calcolo?
Va bene tutto credo, cosa ha di vantaggioso il lambda calcolo in questo 
caso? 

 caso?
erh, sei tu hai chiesto una "formula matematica" per creare sorgenti non
banali ^^;
-- 
By ZeD

 banali ^^;
Ti riferisci alla tecnica di riscrittura di funzioni ben formate?
La formula dovrebbe essere comunque sviluppata in C++.
Ad esempio.
Immagina il tipico programma hello world, con tanto di spazi necessari a non 
fare concatenare stringhe che dovrebbero essere separate da almeno uno 
spazio.
Ogni carattere ha un codice ascii. Bisogna trovare una formula che generi la 
sequenza numerica che convertita in char dia il sorgente.
Si tratta di lavorare con incrementi e decrementi, che opportunamente 
passati come parametro alla funzione, diano come risultato il codice ascii 
del carattere che ci interessa. 

Esempio chiarificatore:
Per scrivere #include
I valori ASCII dei caratteri sono i seguenti
// 35 #
// 105 i
// 110 n
// 99 c
// 108 l
// 117 u
// 100 d
// 101 e
Una sequenza che li genera � la seguente.
35 + 70 + 5 - 11 + 9 + 9 - 17 + 1
Bisogna trovare la funzione f(n) che al variare di n generi tale sequenza.
Io ho provato a usare solo somme e sottrazioni ma qualche altro operatore va 
bene, il problema � trovare la formula generatrice.