#include <memory>
#include <unordered_map>
#include <iostream>
#include <functional>
#include <string>

class Base {};

class Factory {
public:
   typedef std::unordered_map<std::string, std::function<std::shared_ptr<Base>(void)>> map_type; // wow... lol
   
   template<typename T>
   static std::shared_ptr<Base> createInstance() {
      return std::shared_ptr<Base>(new T{});
   }
   
   static std::shared_ptr<map_type> getMap() {
      if (map_ == nullptr) {
         map_.reset(new map_type);
      }
      return map_;
   }
   
private:
   static std::shared_ptr<map_type> map_;
};

std::shared_ptr<Factory::map_type> Factory::map_ = nullptr;

template<typename T>
class RegisterPlaceholder : Factory {
public:
   RegisterPlaceholder(std::string const& s) {
      Factory::getMap()->insert(std::make_pair(s, &createInstance<T>));
   }
};

class Derived1 : public Base {
public:
   Derived1() {
      std::cout << "Derived1" << std::endl;
   }
   static RegisterPlaceholder<Derived1> reg_;
};
class Derived2 : public Base {
public:
   Derived2() {
      std::cout << "Derived2" << std::endl;
   }
   static RegisterPlaceholder<Derived2> reg_;
};

RegisterPlaceholder<Derived1> Derived1::reg_{"Derived1"};
RegisterPlaceholder<Derived2> Derived2::reg_{"Derived2"};

int
main() {
   auto& map = *Factory::getMap();
   map["Derived1"]();
   map["Derived2"]();
}