Public feed
#528427
template<class BaseType>class BaseFactory{ public: virtual BaseType* create() = 0;};template<class BaseType, class T>class DerivedFactory : public BaseFactory<BaseType>{ public: virtual BaseType* create() { return new T(); }};template<typename KeyType, class BaseType>class ChildFactoryMap{ private: typedef std::map<KeyType, BaseFactory<BaseType>*> MapType; MapType derivedFactories; public: ~ChildFactoryMap() { for(typename MapType::iterator i = derivedFactories.begin(); i != derivedFactories.end(); ++i) { delete i->second; } } template<typename T> void addType(const KeyType& key) { derivedFactories.insert(typename MapType::value_type(key, new DerivedFactory<BaseType, T>); } BaseType* create(const KeyType& key) { return derivedFactories.get(key)->create(); }};// Usage is:ChildFactoryMap<std::string, MyBaseClass> m();m.addType<ChildA>("A"); // ChildA derives from MyBaseClassm.addType<ChildB>("B"); // ChildB derives from MyBaseClassm.create("B"); // Returns a new ChildBm.create("A"); // Returns a new ChildA