1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | template <class Base> CreatorBase
{
     virtual Base* create() = 0
}
 
template <class T, class Base> class Creator : public CreatorBase<Base>
{
    virtual Base* create() {return new T;}
};
 
template <class Base> Factory
{
    Base* create(string const &name)
    {
         return myHandledTypes[name]->create();
    }
    void register(string const &name, CreatorBase* c)
    {
         myHandledTypes[name] = c;
    } 
private:
    map<string, CreatorBase *> myHandledTypes;
};
 
int main()
{
    Factory<A> f;
    f.register("a1", Creator<a1, A>());
    f.register("a2", Creator<a2, A>());
    A* toto = f.create("a1");
} | 
Partager