09/06/16 12:29
TheDarkJuster
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 uso void* tutto "funziona":
La domanda è questa: Cosa ha di sbagliato il codice sopra? Perchè al compilatore crea così tanti problemi?
Dove sto sbagliando?
Questo codice è perfettamente valido:
ma io voglio questo:
perchè poi voglio fare:
Type::getType("nome del mio tipo"->newInstanceWithoutArgs();
e newInstanceWithoutArgs() richiama il membro di classe Type:
in questo modo:
Ma tutto questo non sta in piedi se il compilatore non accetta di compilare una funzione template che ritorna ReflectableObject.
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:
template <class T> SeaDragon::ReflectableObject* createReflectableObject(); template <class T> SeaDragon::ReflectableObject* createReflectableObject() { return new SeaDragon::ReflectableObject(); }
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 uso void* tutto "funziona":
template <class T> void* createReflectableObject(); template <class T> void* createReflectableObject() { return (void*)(new SeaDragon::ReflectableObject()); }
La domanda è questa: Cosa ha di sbagliato il codice sopra? Perchè al compilatore crea così tanti problemi?
Dove sto sbagliando?
Questo codice è perfettamente valido:
template <class T> void* createReflectableObject(); template <class T> void* createReflectableObject() { return (void*)(new T()); }
ma io voglio questo:
template <class T> SeaDragon::ReflectableObject* createReflectableObject(); template <class T> SeaDragon::ReflectableObject* createReflectableObject() { return (SeaDragon::ReflectableObject*)(new T()); }
perchè poi voglio fare:
Type::getType("nome del mio tipo"->newInstanceWithoutArgs();
e newInstanceWithoutArgs() richiama il membro di classe Type:
SeaDragon::ReflectableObject* (*puntatoreAFunzioneCheCreaLaNuovaIstanza)();
in questo modo:
this->puntatoreAFunzioneCheCreaLaNuovaIstanza();
Ma tutto questo non sta in piedi se il compilatore non accetta di compilare una funzione template che ritorna ReflectableObject.
aaa