template BaseClassType *CreateObject() { return new ClassType(); } template class ObjectFactory { protected: typedef BaseClassType *(*CreateObjectFunc)(); public: typedef typename std::map::const_iterator ConstIterator; typedef typename std::map::iterator Iterator; template bool Register(UniqueIdType unique_id) { if (m_object_creator.find(unique_id) != m_object_creator.end()) return false; m_object_creator[unique_id] = &CreateObject; return true; } bool Unregister(UniqueIdType unique_id) { return (m_object_creator.erase(unique_id) == 1); } BaseClassType *Create(UniqueIdType unique_id) { Iterator iter = m_object_creator.find(unique_id); if (iter == m_object_creator.end()) return NULL; return ((*iter).second)(); } ConstIterator GetBegin() const { return m_object_creator.begin(); } Iterator GetBegin() { return m_object_creator.begin(); } ConstIterator GetEnd() const { return m_object_creator.end(); } Iterator GetEnd() { return m_object_creator.end(); } protected: std::map m_object_creator; };