Ik heb vandaag een aantal uren geprobeert een 'gem' uit Game Programming Gems II wat bij te werken. Het gaat hier om een 'home-made' RTTI implementatie. Deze wil ik koppelen aan mijn ObjectFactory, zodat elk object wat geregistreerd staat, ook te creeren is via de stringnaam.
Helaas blijkt het niet zo simpel als ik dacht. Ik krijg het niet voor elkaar om het object wat geregistreerd moet worden mee te geven aan de constructor van de RTTI class. Dit kan niet via een instance uiteraard
.
De ObjectFactory zelf gebruikt een template hiervoor:
Bruikbaar als:
Het leek me dus alleen mooi als dit vanzelf mee zou gaan met de home-made RTTI implementatie. Deze RTTI werkt simpel weg met een enkele instantie van een class, bovenaan elke .cpp file:
Het bovenstaande werkt. De string gaat mee, de parent, en het ID. No problem. Echter: "CEActorRoot" is het root element van alle objecten in de gehele applicatie. Ik kan helaas geen CEActorRoot* object gebruiken bij de class factory. Dit moet echt een niet geinstantieerde object (naam) zijn.
Daarom probeerde ik dit:
En voor het initializen:
Echter begint de compiler fouten te geven op de < en ;'s e.d. Geen success.
Wanneer ik Template T als argument probeer te gebruiken (en de functie dus aanpas):
illegal use of this type as an expression with [Type=CEActorRoot]
Ook geen success
.
Een simpele test zonder inwat anders dan een constructor:
En de code:
Werkt perfect (in een functie)
... Dus ik vermoed dat het onmogelijk is om de template te gebruiken in de constructor
?
Heeft iemand een idee
Helaas blijkt het niet zo simpel als ik dacht. Ik krijg het niet voor elkaar om het object wat geregistreerd moet worden mee te geven aan de constructor van de RTTI class. Dit kan niet via een instance uiteraard
De ObjectFactory zelf gebruikt een template hiervoor:
C++:
1
2
3
4
5
| template<typename ClassType> bool Register(UniqueIdType unique_id) { .... } |
Bruikbaar als:
C++:
1
| .Register<CABuilding_Store>("CABuilding_Store"); |
Het leek me dus alleen mooi als dit vanzelf mee zou gaan met de home-made RTTI implementatie. Deze RTTI werkt simpel weg met een enkele instantie van een class, bovenaan elke .cpp file:
C++:
1
| dtiClass CABuilding_Bank::Type("CABuilding_Bank", &CEActorRoot::Type, _CABuilding_Bank ); |
Het bovenstaande werkt. De string gaat mee, de parent, en het ID. No problem. Echter: "CEActorRoot" is het root element van alle objecten in de gehele applicatie. Ik kan helaas geen CEActorRoot* object gebruiken bij de class factory. Dit moet echt een niet geinstantieerde object (naam) zijn.
Daarom probeerde ik dit:
C++:
1
2
3
4
5
| template<typename T> dtiClass(std::string szSetName, dtiClass* pSetParent, UINT ObjectTypeID) { .... } |
En voor het initializen:
C++:
1
| dtiClass CABuilding_Bank::Type<CABuilding_Bank>("CABuilding_Bank", &CEActorRoot::Type, _CABuilding_Bank ); |
Echter begint de compiler fouten te geven op de < en ;'s e.d. Geen success.
Wanneer ik Template T als argument probeer te gebruiken (en de functie dus aanpas):
illegal use of this type as an expression with [Type=CEActorRoot]
Ook geen success
Een simpele test zonder inwat anders dan een constructor:
C++:
1
2
3
4
| template<typename T> void test() { CSingleton<CEActorManager>::GetPointer()->GetFactory().Register<T>(szName); } |
En de code:
C++:
1
| Type.test<CABuilding_Bank>(); |
Werkt perfect (in een functie)
Heeft iemand een idee