Oppure

Loading
20/02/16 10:44
TheDarkJuster
Buongiorno a tutti!
Oggi sono qui a chiedere aiuto nella comprensione di un articolo: pfultz2.com/blog/2012/07/31/reflection-in-under-100-lines/. L'articolo si concentra su come aggiungere la reflection alle classi del c++, ma proprio non riesco a capire come funziona..... Qualcuno può illuminarmi?

Next, we define a REFLECTABLE macro to generate the data about each field(plus the field itself). This macro will be called like this:
REFLECTABLE
(
    (const char *) name,
    (int) age
)

ma non doveva essere una macro? Non inizia con #define ? dubito quel codice sia valido........

Io dopo averlo letto rimango con una enorme perplessità........... :noway::noway::noway::noway::noway:
aaa
20/02/16 14:19
Template
Forse dirò una cavolata, ma... se leggi il codice subito dopo, noti le righe

#define REFLECTABLE(...) \
static const int fields_n = BOOST_PP_VARIADIC_SIZE(__VA_ARGS__); \
friend struct reflector; \


E quindi credo che quello che hai citato tu sia solo il "corpo" della macro (isolato per maggior leggibilità dell'articolo), la quale va effettivamente definita come indicato in quest'altro frammento che ti ho citato ;)
Ultima modifica effettuata da Template 20/02/16 14:20
aaa
20/02/16 14:31
TheDarkJuster
Oh già.... non lo avevo notato.... Ma rimane il fatto che non riesco a capire l'idea su cui si basa tutto quel codice........:om::om::om:
aaa
20/02/16 22:00
Template
Su quello non posso aiutarti: so cos'è la reflection, ma credo che nel codice si faccia uso di materiale delle librerie Boost, che conosco solo di fama.
Ultima modifica effettuata da Template 20/02/16 22:01
aaa
20/02/16 22:57
lumo
È un po' di magia voodoo con template e macro variadiche del C.
Se capisci bene le ultime, la parte con i template non è difficilissima.
Secondo me è meglio tenersi alla larga da certe cose, ma suppongo che tu lo stia facendo per curiosità, quindi invece di sentire una spiegazione di me ti consiglio di prendere il primo pezzo di codice
 REFLECTABLE (     (const char *) name,     (int) age ) 

E provare ad espanderlo a mano (sia le macro che i template).
La parte boost c'è ma è minima e non è essenziale per la comprensione, puoi espanderla ad intuito.
Ovviamente vedrai che il codice che viene fuori ha senso solo all'interno di una class o di una struct.
aaa
21/02/16 0:14
TheDarkJuster
Beh non direi proprio per esperimento....

Io necessito di una funzione che ritorna un oggetto istanza dk classe reflectedObject. Questo oggetto può restituire il nome della classe di cui l'oggetto iniziale è istanza, permettere la lettura e scrittura delle sue proprietà.

Una soluzione da me pensata è quella di usare l'override su GetReflectionObject() e per ogni classe creare a mano una classe derivata di reflectedObject, ma mi sembra un lavoro-suicidio.

Così cercavo di esplorare la strada della generazione di metadati da parte del compilatore, e sono finito in quella pagina.
aaa
21/02/16 0:25
TheDarkJuster
Vediamo se anche all'una di notte riesco a capire le cose:

Dato il comportamento di BOOST_PP_VARIADIC_SIZE boost.org/doc/libs/1_49_0/libs/preprocessor/doc/ref/…
Se io espando
REFLECTABLE (     (const char *) name,     (int) age ) 

ottengo:
static const int fields_n = 2; friend struct reflector;


Ho commesso qualche errore in questo punto?
aaa
21/02/16 0:44
lumo
Devi andare avanti, la parte essenziale è
BOOST_PP_SEQ_FOR_EACH_I(REFLECT_EACH, data, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

le cose usate qui sono definite sotto
aaa