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