// 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<std::string, Creator *> 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;
}