1 template<
class Interface,
typename KeyT =
int>
6 typedef Interface* Type;
7 typedef Type (*Creator)();
9 bool define(Key
const& key, Creator v) {
return _registry.insert(
typename Registry::value_type(key, v)).second; }
10 Type create(Key
const& key)
12 typename Registry::const_iterator i = _registry.find(key);
13 if (i == _registry.end())
14 throw std::invalid_argument(std::string(__PRETTY_FUNCTION__) +
": key not registered");
19 template<
class Base,
class Actual>
21 Base* create_func() {
return new Actual; }
24 typedef std::map<Key, Creator> Registry;
31 typedef ::Factory<Base>
Factory;
33 virtual int answer()
const = 0;
36 Factory::Type create(Factory::Key
const& name) {
return _factory.create(name); }
38 template<
class Derived>
39 static void define(Factory::Key
const& name)
41 bool new_key = _factory.define(name, &Factory::template create_func<Base, Derived>);
43 throw std::logic_error(std::string(__PRETTY_FUNCTION__) +
": name already registered");
47 static Factory _factory;
49 Base::Factory Base::_factory;
53 virtual int answer()
const {
return 42; }
59 assert(Base::create(
"A")->answer() == 42);
Definition: factory.hpp:2
Definition: factory.hpp:51
Definition: factory.hpp:28