fork(16) download
  1. #include <map>
  2. #include <memory>
  3. #include <string>
  4.  
  5. struct IRenderer {};
  6.  
  7. class UserRendererMultiArgs : public IRenderer {
  8. public:
  9. UserRendererMultiArgs(int, int) {}
  10. ~UserRendererMultiArgs() {}
  11. static IRenderer *Create(int i1, int i2) {
  12. return new UserRendererMultiArgs(i1, i2);
  13. }
  14. };
  15.  
  16. template <class... Args>
  17. struct MapHolder{
  18. static std::map<std::string, IRenderer *(*)(Args...)> CallbackMap;
  19. };
  20.  
  21. template <class... Args>
  22. std::map<std::string, IRenderer *(*)(Args...)> MapHolder<Args...>::CallbackMap;
  23.  
  24. class RendererFactory {
  25. public:
  26. template <class... Args>
  27. static void RegisterRenderer(std::string name, IRenderer *(*Callback)(Args...)) {
  28. MapHolder<Args...>::CallbackMap[name] = Callback;
  29. }
  30.  
  31. template <class... Args>
  32. static IRenderer *Create(const std::string &name, Args &&... args) {
  33. return MapHolder<Args...>::CallbackMap[name](std::forward<Args>(args)...);
  34. }
  35. };
  36.  
  37. int main() {
  38. RendererFactory::RegisterRenderer("user", &UserRendererMultiArgs::Create);
  39. std::unique_ptr<IRenderer> r{RendererFactory::Create("user", 42, 3)};
  40. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
Standard output is empty