// To register a component, place on global scope #define REGISTER_CREATOR( NAME ) \ Component *NAME##Create( void )\ { \ return new NAME( ); \ } \ NAME##Creator( #NAME, NAME##Create ) struct Creator { Creator( const char *name, Component *(*fn)( void ) ) : Create( fn ) { // Assume FACTORY is a global singleton or pointer FACTORY->Register( name, this ); } Component *(*Create)( void ); } class Factory { public: Component *CreateComponent( const std::string& name ); void Register( const char *name, Creator creator ); private: std::map m_map; }; Component *Factory::CreateComponent( const std::string& name ) { return m_map[name]->Create( ); } void Factory::Register( const char *name, Creator creator ) { m_map[std::string( name )] = creator; }