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

Volevo definire una funzione che lavorasse indistintamente con una deque
<MyObj> o con una list<MyObj>.
Avevo pensato ad una cosa tipo:
template <class  LIST> void MyFunc (const LIST& lista)
{
}
perň in questa maniera la funzione accetta anche deque o list con
oggetti non MyObj. Come faccio a farla in modo che accetti solamente
contenitori di MyObj?
(Ho provato una cosa tipo template<class LIST<MyObj> void MyFunc(const
LIST& lista) ma non funziona, i template mi sono proprio ostici).
Ciao Fbf.

 wrote in message 38777DA4...@libero.it...
: Volevo definire una funzione che lavorasse indistintamente con una deque
: <MyObj> o con una list<MyObj>.
per l'efficienza, ti consiglio deque<MyObj*> e list<MyObj*>
[zak]
: (Ho provato una cosa tipo template<class LIST<MyObj> void MyFunc(const
: LIST& lista) ma non funziona, i template mi sono proprio ostici).
devi scrivere ESATTAMENTE:
teplate<class LIST<MyObj*> > void ...
con almeno uno spazio tra le due > finali, altrimenti il compilatore penza
che si tratti dell'operatore >>.
--
____ __         __,_      __  _____
\  _\_ \  ___ _/ / /\  /\/  \/ / _/ It is better to reign in Hell
 \  _ \ \/ _ '/ , |\ VV / / / / _/ Than serve in Heaven.- MILTON
  \_,_/\_\_,_/_/|_| \__/\__/_/_/
      -- the one and only --     e-mail : 
blak...@tiscalinet.it
                                ICQ    : 59394345
The UNIX Guru's View of Sex:
$unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep

 LIST& lista) ma non funziona, i template mi sono proprio ostici).
In teoria,
    template <typename T>
    void MyFunc(const T<MyObj>& lista)
    {
    }
dovrebbe avvicinarsi di piu` ai desideri che esprimi (ma non li
soddisfa: non c'e` modo di accettare deque e list, ma non anche
vector e set, ad esempio... non senza che il _corpo_ della
funzione esprima implicitamente i requisiti!!!).
Non sorprenderti se un qualsiasi dato compilatore non e` in
grado di recepire questo costrutto, comunque.
L'idea base del generic programming e` invece:
    struct MyObj {
        void peep() const {}
    };
    template <typename T>
    void MyFunc(const T& lista)
    {
        lista.begin()->peep();
    }
ove T e` qualsiasi tipo che abbia un membro (const) begin che,
chiamato, torna un qualche oggetto che definisce un operator->
che delega ad un oggetto che implementi un membro "peep".
Piu` feature usi nella MyFunc, piu` vincolato sara` T.  Perche`
vincolarlo ancor piu` del necessario...?
Alex

 teplate<class LIST<MyObj*> > void ...
    ^
Esattamente?
Ciao,
Nicola


Ci manca solo qualcuno che ci fa notare la posizione della virgola
all'interno di una frase, le coniugazioni dei verbi, la sintassi
della lingua italiana e poi siamo a posto.
Sicuramente  "teplate"  non e' "char" o "const" o "static" o ....
Grazie per la mail. Era fondamentale.
Fausto


Personalmente trovo buffo che qualcuno specifichi addirittura in
maiuscolo di scrivere qualcosa esattamente e poi la scriva in modo
scorretto. E' invecemente triste che qualcun altro non riconosca
un'innocente battuta senza uno smiley che indichi l'intenzione
sarcastica. Ma tu hai bisogno che ti presentino un cartello per
cominciare a ridere? Troppi sceneggiati mi sa...
Ciao,
Nicola