Basically, I want to automatically register object creator functions with an object factory for a bunch of classes defined across many header files.
The top answer t
I find your concept pretty complicated and I'm not sure if it's required. From my point of view your problem can be circumvented when adding the following code:
#include #include #include struct Object{}; // Value Object // provide a simple create function to derived classes template struct ObjectT : public Object { static Object* create() { return new T(); } }; struct ObjectFactory { std::map creators_factory; static ObjectFactory* instance() { static ObjectFactory* __self = NULL; if (__self == NULL) __self = new ObjectFactory(); return __self; } template bool reg(const std::string& id, Object* (*creator)() ) { creators_factory[id] = creator; return true; } // pass in creator function pointer to register it to id static Object* create(const std::string& id) { return instance()->creators_factory[id](); } }; #define REGISTER_CHAIN(T) bool isRegistered_##T = ObjectFactory::instance()->reg(#T, T::create) struct DerivedA : public ObjectT { DerivedA() { std::cout << "DerivedA constructor\n"; } }; REGISTER_CHAIN(DerivedA); struct DerivedB : public ObjectT { DerivedB() { std::cout << "DerivedB constructor\n"; } }; REGISTER_CHAIN(DerivedB); struct DerivedC : public ObjectT { DerivedC() { std::cout << "DerivedC constructor\n"; } }; REGISTER_CHAIN(DerivedC); struct DerivedD : public ObjectT { DerivedD() { std::cout << "DerivedD constructor\n"; } }; REGISTER_CHAIN(DerivedD); int main(void) { // Call last link in the register chain to register all object creators //ObjectFactory::Register::chain(); delete ObjectFactory::create("DerivedA"); delete ObjectFactory::create("DerivedB"); delete ObjectFactory::create("DerivedC"); delete ObjectFactory::create("DerivedD"); return 0; }
I hope this helps.
Best regards, Martin