Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buongiorno a tutti,
sto cercando (invano) di creare un sistema di reflection per il c++ che genera diverse informazioni a compile-time per le nuove classi dichiarate dal programmatore.
Ora.... Io voglio poter fare una cosa del genere...
sapendo che ogni classe su cui la reflection funziona eredita da ReflectableObject io voglio creare una funzione template che dato un tipo ne restitusce una istanza:
L'errore del compilatore (MSVC) è: "dichiarazione/definizione di modello non riconoscibile".
Come potete notare non uso nemmeno il tipo passato come argomento di template: al compilatore da fastidio che il tipo di ritorno sia SeaDragon::ReflectableObject*.
Se guardi l'ultimo test vedi che alla fine tutto è fatto per ottenere una istanza di Type da una stringa contenente il nome con cui è stato registrato il tipo.
e ciò è valido: il tipo è stato rgistrato poche righe sopra:
Codice sorgente - presumibilmente Plain Text
REGISTER_REFLECTABLE_TYPE(reflection_support);
reflection_support eredita da ReflectableObject, solo che al momento della scrittura della domanda ReflectableObject era vuota.
Ora c'è una funzione pubblica e un membro privato. La funzione ritorna il valore del membro privato.
Nient'altro. Non c'è modo di modificare il membro privato (che è li solo come antefatto di un esperimento).
In ogni caso.... vuota o non vuota la build fallisce, quindi attualmente registro una funzione che dato un tipo ne crea una nuova istanza e ritorna l'indirizzo iniziale come void*, la funzione newInstanceWithoutArgs() richiama quella funzione, fa un cast (nemmeno tanto semplice, visto che è un static_cast<ReflectableObject*>( ... ), e non un (ReflectableObject*)( ... )):
Mi scoccia un po' dover fare il cast su newInstanceWithoutArgs, non è affatto elegante, ma a quanto pare il compilatore non mi permette i fare il altro modo.