automatic registration of object creator function with a macro

后端 未结 2 1621
遥遥无期
遥遥无期 2020-12-11 08:30

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

2条回答
  •  鱼传尺愫
    2020-12-11 09:09

    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

提交回复
热议问题