Newsgroup: it.comp.lang.c++
Titolo: Numero variabile di parametri nelle chiamate a funzione

Salve a tutti e grazie mille per le risposte che mi avete fornito
finora.
Ecco il problema: io ho 3 funzioni overloaded
void pizza (int a);
void pizza (int a, int b);
void pizza (int a, int b, int c);
che hanno parti di codice in comune. E' possibile collassarle in
un'unica funzione che "capisca" come è stata chiamata?
Escluderei i valori di default, perché mi costringerebbero a usare un
valore convenzionale (es. MAX_INT) e questo non mi sembra molto bello.
Pensavo invece a uno pseudocodice di qs tipo:
void pizza (int a, ...)
{
	codice_condiviso();
	if (fz_chiamata_con_1_arg)
	{/*...*/}
	if (fz_chiamata_con_2_arg)
	{/*...*/}
	if (fz_chiamata_con_3_arg)
	{/*...*/}
}
Cosa proponete?
Grazie, giulio
Per favore togliete "!RemoveMe!" dall'indirizzo per rispondere
Please remove "!RemoveMe!" from the address to reply

 Cosa proponete?
Dal basso della mia esperienza di C++ mi arrischio a proporre una
mia impressione (con la speranza di essere corretto nel caso di
mie cavolate):
io implementerei 3 funzioni (una per ogni chiamata a pizza()), piu'
una quarta, contenente il codice condiviso, richiamata dalle tre
funzioni precedenti.
See you
Robbyy

funzioni precedenti.
Sě, scusate, colpa mia, effettivamente il codice condiviso non č cosě
compatto, č distribuito nella funzione, e se faccio 3 funzioni + n
altre funzioncine ausiliarie salta fuori una spaghettata...
Grazie cmq, giulio


un'unica funzione che "capisca" come è stata chiamata?
E` possibile utilizzando le ellissi (cioe` ...), ma in C++ non e`
assolutamente una buona pratica, perdi ogni controllo sui
tipi e poi perdi anche in efficenza e manutenibilita` perche`
devi capire quanti parametri ti sono stati passati e una modifica
ad una sola delle tre funzioni ti porta ad avere a che fare con il
triplo del codice necessario...
La cosa migliore e` isolare il codice comune in una funzione separata
(al limite inline) e richiamare questa all'interno delle tre funzioni 
(in effetti il tuo e` un caso di mancato riuso del codice).
Paolo
-----------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------

 un'unica funzione che "capisca" come è stata chiamata?
E invece fare in modo che tutte chiamino un'unica funzione (privata) con un
parametro in più?
es:
void pizza (int a){
    pizza_privata (a, 0, 0, 1);
}
void pizza (int a, int b){
    pizza_privata (a, b, 0, 1);
}
void pizza (int a, int b, int c){
    pizza_privata (a, b, c, 1);
}
pizza_privata (int a, int b, int c, int num_parametri){
switch (num_parametri){
    case1:
    ...
}
}
--
Alessandro Monti

altre funzioncine ausiliarie salta fuori una spaghettata...
Se questi frammenti di codice hanno un loro senso (e presumo di si),
la soluzione e` ancora valida... Ovviamente avrai piu` funzioni 
ausiliarie.
Se non fosse cosi`, sei sicuro che l'azione astratta delle tre funzioni
overloaded sia identica? O che non sia arrangiabile in un modo migliore?


Posso correggerti, Alessandro?
Mi pare tu abbia commesso un errore, se infatti tu utilizzi la quarta
variabile come int num_parametri, e sulle chiamate imposti
void pizza (int a){
    pizza_privata (a, 0, 0, 1);
}
void pizza (int a, int b){
    pizza_privata (a, b, 0, 1);
}
void pizza (int a, int b, int c){
    pizza_privata (a, b, c, 1);
}
pizza_privata (int a, int b, int c, int num_parametri){
switch (num_parametri){
    case1:
    ...
};
}
num_parametri è sempre 1, il listato corretto mi pare essere
void pizza (int a){
    pizza_privata (a, 0, 0, 1);
}
void pizza (int a, int b){
    pizza_privata (a, b, 0, 2);
}
void pizza (int a, int b, int c){
    pizza_privata (a, b, c, 3);
}
pizza_privata (int a, int b, int c, int num_parametri){
switch (num_parametri){
    case1:
};
}
In cui num_parametri assume realmente il numero dei parametri.
Spero di non essermi sbagliato.
--
Diego "1985" Pettenò
per gli spammer la mail è
diego...@hotmail.com
per i messaggi seri è
diego....@tiscalinet.it

 Spero di non essermi sbagliato.
Hai ragione. Avrei bisogno di un taglia-incolla più intelligente di me :-)
--
Alessandro Monti

>Hai ragione. Avrei bisogno di un taglia-incolla più intelligente di me :-)
Ereditarieta' ? incapsulamento? polimorfismo? bahhhh...roba vecchia!
lo strumento principe del futuro di ogni sviluppatore (C++ e non) e' in 
cut'n'paste, altro che !! :-)))
-- 
universe::earth::internet::albion->Greetz++;
 
darX...@tin.it
 
alb...@libero.it
  Fido 2:335/234.21   
http://darxstar.cjb.net
  ICQ UIN# 11151997 - eggdrop on demand
<the trees that whisper in the evening...>

 cut'n'paste, altro che !! :-)))
Stai facendo una battuta o non hai letto i post precedenti?
--
Alessandro Monti

 cut'n'paste, altro che !! :-)))
Embe? Io attualmente programmo cosi'....
See you                                                        Robbyy