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

Cosa ne pensate di avere un supporto alla reflection in c++?
Se doveste implementare qualcosa di simile che approccio usereste?
Cosa esiste in tema di già realizzato?

 Cosa ne pensate di avere un supporto alla reflection in c++?
E che e'?
Hai un link?
 bye
	av.


Penso che dovrebbe essere gestito a livello di compilatore (e linker).
Se in programma metti una funzione:
int pippo (int prova) {...}
Quando alla fine ottieni l'eseguibile .exe non sai piu' niente di pippo 
(anzi non sai neanche se esiste una funzione 'pippo'), di quali/quanti 
parametri riceve e quale parametro restituisce, ecc...

 E che e'?
accedere a run-time a informazioni come il tipo delle variabili come se 
fossero dati, o al generatore di codice come se fosse una libreria
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.2.1. C, C++ and ASM developers
                               and beta testers are welcome!

fossero dati, o al generatore di codice come se fosse una libreria
La mia prima reazione č: non ne sento affatto il bisogno.
Perň non vorrei essere troppo conservatore. Se mi mostri un qualcosa
che si puň fare con la reflection, e che avrei sempre desiderato
potere fare...

 o al generatore di codice come se fosse una libreria
Questo lo capisco ancora meno. Hai un esempio?
 bye & Thanks
	av.

 potere fare...
Debug, ad esempio. 
-- 
Luc

 potere fare...
Concordo pienamente!
Ho visto usare la reflection di java in qualche progetto e sinceramente,
penso che con un design un po' piu' accurato si poteva fare meglio e
senza...
Pero' l'idea m'intriga :-)
Un'idea:
class Aclass : public reflectable
  {
  public:
    void foo1();
    int foo2(int x);
    Aclass()
      {
      publish( "foo1", &foo1 );
      publish( "foo2", &foo2 );
      }
  };
tanto per iniziare il thread...

 potere fare...
Io ci sto solo giocando... Vivo bene anche senza :-)
Cmq un esempio potrebbe essere la serializzazione e deserializzazione
automatica di oggetti.

 Cosa esiste in tema di già realizzato?
Occorre distinguere tra il tipo di meccanismo che puo' mettere a
disposizione il compilatore, che sarebbe potenzialmente in grado di
costruire una rappresentazione per l'intero type system, e le
funzionalita' che puo' fornire una libreria, che generalmente richiede
di esprimere esplicitamente le entita' che devono essere
meta-rappresentate, magari mediante l'uso di tool appositi.
A mio avviso entrambe le alternative possono essere utili in contesti
diversi; l'importante e' che questi meccanismi siano comunque
opzionali e che non pesino su chi non li usa.
Ciao,
Nicola

 tanto per iniziare il thread...
Saro' tonto, ma poi?
Cosa fa quanto hai scritto? Che cosa consente di fare all'utilizzatore
di Aclass?
 bye
	av.

 
Fai finta che sia... un RTTI++
Dai un'occhiata alle API di java.
Package java.lang.reflect
guarda le classi Method e Field (mi pare si chiamino cosě).
E poi la classe Class.
Ciao...

 di Aclass?
No, aspetta...
Non volevo postare una soluzione, soltanto... se hai presente la reflection
in java, questa vuol'essere un'idea per iniziare ad implementare qualcosa
di simile in C++.
In java la refl. permette di esplorare quali metodi possiede una classe di
cui l'interfaccia e' sconosciuta (ed altre cose). L'idea e' che in C++ i
metodi possono essere "pubblicati" manualmente (perche' non c'e' il
supporto del compilatore) in un qualche tipo di db implementato nella
classe base "reflectable", che dovra' poi esporre dei metodi per averne
indietro il puntatore, tipo:
Aclass a;
...
reflectable * r = &a;
...
try
  {
  int (reflectable::* meth)(int) = r -> getMethod<int,int>( "foo2" );
  cout << ((*r).*(meth))(10);
  }
catch ( UndefinedMethod & e )
  {
  ...
  }
(la sintassi e' ignobile, e forse c'e' qualche errore per come l'ho scritta,
ma magari con qualcosa in piu' tipo "functor" diventa umana...)
Non so se la reflection sia veramente utile in C++ e di sicuro il mio codice
e' un abbozzo piuttosto naif, ma se a qualcuno l'idea piace... :-)
Ciao!

 di simile in C++.
Ecco, e' questo il punto, non conosco Java e non sapevo cosa fosse la
reflection.
Ora che me l'hai vagamente spiegata, quale puo' essere un suo utilizzo?
Ti viene in mente un esempio?
 bye & Thanks
	av.

 Ciao...
Non consco java :(
 bye
	av.

 	av.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 dichiarati ed il gioco e' fatto.
Nell'ambito del C++ trovo i meccanismi invasivi di introspezione una
porcheria. Molto meglio strutture di descrizione esterne ottenibili
tramite chiamate a funzioni libere.
Ciao,
Nicola

 tramite chiamate a funzioni libere.
Se per invasiva intendi fare estendere ogni classe da (ad esempio) Reflect
sono d'accordo.
Però un approccio invasivo tipo questo credo sia abbastanza *elegante*
class Prova
{
   static Klass klass;
};
Curiosità: perchè criticare gli approcci invasivi?!
Non credo comporti eccessivi danni modificare leggermente una classe... o si!?
Se si quali danni potrebbe arrecare?

 Se si quali danni potrebbe arrecare?
Esistono un'infinita' di librerie scientifiche gia' scritte di cui si
dispone solo dei .so e, se il sorgente era c o c++, anche degli header.
Riuscire a riutilizzare questo software senza modificarlo e' difficile
ma non impossibile.
Se, come nel mio caso, lo scenario e' questo, le tecniche invasive non
sono applicabili, meglio operare dei trucchi per aggirare il problema
delle variabili private.
Del resto chi mette volentieri le mani sul codice scritto da altri?
ciao
gian luigi


...

Ci sono due problemi, uno concettuale ed uno pratico. Quello
concettuale riguarda la separazione dei compiti: una cosa e'
rappresentare un impiegato, un'altra serializzare dei dati. Due
compiti, due costrutti; l'aspetto pratico riguarda l'imporre un costo
a chi non usa questa funzionalita', costo che si paga in termini di
spazio in memoria, ma anche di interdipendenze inutili in
compilazione, con librerie, ecc.
Ciao,
Nicola

 
Si potrebbero trattare i tipi di queste librererie gią compilate (o su
cui non ci si vuole mettere le mani) come fossero tipi base del
linguaggio.
Per esempio... non voglio troppo informazioni sui contenitori delle
STL, mi basterebbe trattarli come tipi base.
C'č qualcuno di voi che ha mai *parsato* file c++!?
Da dove si parte?! Consigli? Robe gią fatte?
Altra domanda:
Avete mai guardato openc++!? Pareri!?

 Da dove si parte?! Consigli? Robe già fatte?
[...] 
Ho fatto di tutto per non parsarlo ma alla fine ho dovuto cedere.
Esistono un mucchio di robe gia' fatte.
Per esempio Exuberant Ctags parse circa 20 linguaggi diversi dicendoti
tutte le classi, le struct, le funzioni, le define, ..., incontrate.
Potresti utilizzare l'esportazione in XML del Doxygen per un report piu'
completo del ctags.
Il max lo ottieni con i parser che tirano fuori il GXL... ma devi essere
proprio disperato per ricorrere a questi :)


 compilazione, con librerie, ecc.
La penso anch'io cosi'...
Inoltre, a ben guardare, credo che l'uso di una serializzazione
"automatica", basata su un concetto tipo-reflection in C++ (ma anche in
java forse) non sia realmente utile: serializzare una classe "semplice"
puo' essere automatizzato con la reflection, ma e' anche piuttosto facile
farlo a mano, e se gli oggetti da serializzare iniziano a diventare
complessi, se contengono reference, puntatori ecc. la serializzazione
produrra' seri problemi. Inoltre un oggetto puo' contenere dati al suo
interno che non ne identificano lo stato in senso stretto (es: cache) e che
quindi e' inutile e inefficiente serializzare...
Se devo progettare una classe e voglio renderla serializzabile, piuttosto
che inserire il codice necessario direttamente al suo interno magari
mediante qualche metodo di "pubblicazione degli attributi" come si diceva
qualche riga piu' su, penso che si potrebbe sfruttare la versatilita' del 
C++ e utilizzare ad esempio un po' di programmazione generica "creativa":
una classe template Serializer<obj>, della quale e' possibile realizzare
specializzazioni esplicite, consente di fare piu' o meno le stesse cose,
con uno sforzo paragonabile, e senza violare l'incapsulazione. Tra l'altro
non crea dipendenze inutili se si implementa separatamente...
Non so, io in realta' avevo proposto quel semplice esempio per la reflection
solo "per gioco", e non avevo pensato all'uso della refl. per la
serializzazione. 
Sono ancora dubbioso che la reflection possa essere veramente utile in un
programma reale, credo che quasi sempre un design accurato consenta di fare
le stesse cose in modo piu' efficiente, riducento contemporaneamente la
possibilita' di avere errori imprevisti a run-time.
Ciao,
Francesco.

 ...
Senti, sono completamente a digiuno sia di reflection che di
serializzazione.
Di quest'ultima pero' ho sentito parlare spesso e credo che potrebbe
tornarmi utile in un progetto che sto elaborando e che al momento e'
ancora in fase preliminare.
Hai qualche link a trattazioni da zero sull'argomento?
 bye & Thanks
	av.

 av.
Uhm? Cosi' al volo (con google) ho trovato questo:
http://www.parashift.com/c++-faq-lite/serialization.html
Per qualcosa di piu' preciso, e meglio che risponda qualcun'altro :-)
Ciao!

 
http://www.parashift.com/c++-faq-lite/serialization.html
Grazie.
Conoscevo questa risorsa, ma l'ultima volta che l'avevo visitata questa
sezione non c'era ancora.
Comunque non mi ha detto poi molto di nuovo, ha solo un po' riordinato
le mie idee.
In sostanza ho scoperto di aver gia' implementato la serializzazione
piu' volte senza sapere cos'era :)
Quindi il discorso sulla reflection era per trovare un modo
[semi]-automatico per generare il codice per la serializzazione?
 bye & Thanks
	av.

 non crea dipendenze inutili se si implementa separatamente...
Siamo assolutamente d'accordo. Cioe', l'incapsulamento viene violato
per forza, perche' devo sapere la mia classe come e' fatta dentro, ma
se non altro evito di essere invasivo.
Ciao,
Nicola

 [semi]-automatico per generare il codice per la serializzazione?
Mi corregga qualcuno che conosce java meglio di me se sbaglio, comunque
credo che in effetti la reflection di java abbia riscosso successo
soprattutto per implementare metodi di serializzazione...
Io, ad esempio, avevo lavorato un po' su un progetto in cui, per scmbiare
attraverso "stream" alcuni oggetti, questi ultimi dovevano essere dotati di
un set di metodi getXYZ() e setXYZ(), con XYZ corrispondenti, per ogni
data-member che doveva essere "copiato". Il motore del sistema si occupava
di copiare gli oggetti attraverso il canale esplorandone i metodi (con la
reflection) ed eseguendo per ognuno getXYZ() da un lato e setXYZ()
dall'altro.
Ciao!

 [semi]-automatico per generare il codice per la serializzazione?
Per esempio. A proposito di serializzazione si e' parlato molto sulla
mailing list di Boost, dove c'e' una libreria che sta per essere
accettata. Maggiori notizie a partire da qui:
http://www.boost.org/more/mailing_lists.htm#main
Ciao,
Nicola


--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 possibilita' di avere errori imprevisti a run-time.
Ora, visto che sono gia' stato impegnato in due progetti in cui ho
utilizzato la reflection, cerchero' di convincerti di quanto sia utile.
Supponi che tu carichi da un file XML il nome di un metodo, e qualcuno ti
dia l'oggetto su cui eseguire tale metodo. Come fai? Supponi anche che
questo oggetto abbia 100 metodi al prioprio interno.
Uno che non conosce la reflection rispondera': ci piazzo una bella sfilza di
if then else e me la cavo cosi'.
Ma non sarebbe piu' comodo avere un comando del tipo:.
m.Invoke(nomemetodo,[]parametro) con nomemetodo stringa?
Si sarebbe molto meglio, per due ragioni:
1) 100 if sono noiosi
2) a tempo di compilazione 100 if e neanche 1000 potrebbero bastarti per
scansire tutti i casi. Questo perche' non puoi conoscerli tutti quando
scrivi il codice(anzi, potresti non conoscerne nessuno).
Non sarebbe meglio automatizzare la chiamata al metodo?
Il problema della reflection in C++ mi interessa molto.
I progetti in cui ho utilizzato la reflection erano in Java e C#
(interprete.....).
Ma per qualcosa di compilato, esistono informazioni a run time sui tipi?
Se si, bene, si potrebbero sfruttare. Se no, rassegnamoci.
La strada dei template e RTTI vale la pena di essere esplorata.
ciao.


 La strada dei template e RTTI vale la pena di essere esplorata.
Implementare qualcosa di simile alla reflection, anche solo per gioco, mi
incuriosice, ma temo che il supporto del compilatore C++ sia abbastanza
scarso... Ci sarebbe molto da fare a mano!
Se ho capito male qualche cosa, o se ti (vi) va di chiacchierarne un po', mi
farebbe piacere leggere qualche risposta. Non vi prometto di rispondere
molto velocemente perche' in questo periodo leggo un po' di rado il
newsgroup.
Ciao!