#include <map>
#include <memory>
#include <string>
struct IRenderer {};
class UserRendererMultiArgs : public IRenderer {
public:
UserRendererMultiArgs(int, int) {}
~UserRendererMultiArgs() {}
static IRenderer *Create(int i1, int i2) {
return new UserRendererMultiArgs(i1, i2);
}
};
template <class... Args>
struct MapHolder{
static std::map<std::string, IRenderer *(*)(Args...)> CallbackMap;
};
template <class... Args>
std::map<std::string, IRenderer *(*)(Args...)> MapHolder<Args...>::CallbackMap;
class RendererFactory {
public:
template <class... Args>
static void RegisterRenderer(std::string name, IRenderer *(*Callback)(Args...)) {
MapHolder<Args...>::CallbackMap[name] = Callback;
}
template <class... Args>
static IRenderer *Create(const std::string &name, Args &&... args) {
return MapHolder<Args...>::CallbackMap[name](std::forward<Args>(args)...);
}
};
int main() {
RendererFactory::RegisterRenderer("user", &UserRendererMultiArgs::Create);
std::unique_ptr<IRenderer> r{RendererFactory::Create("user", 42, 3)};
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHN0cmluZz4KCnN0cnVjdCBJUmVuZGVyZXIge307CgpjbGFzcyBVc2VyUmVuZGVyZXJNdWx0aUFyZ3MgOiBwdWJsaWMgSVJlbmRlcmVyIHsKCXB1YmxpYzoKCVVzZXJSZW5kZXJlck11bHRpQXJncyhpbnQsIGludCkge30KCX5Vc2VyUmVuZGVyZXJNdWx0aUFyZ3MoKSB7fQoJc3RhdGljIElSZW5kZXJlciAqQ3JlYXRlKGludCBpMSwgaW50IGkyKSB7CgkJcmV0dXJuIG5ldyBVc2VyUmVuZGVyZXJNdWx0aUFyZ3MoaTEsIGkyKTsKCX0KfTsKCnRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgpzdHJ1Y3QgTWFwSG9sZGVyewoJc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJUmVuZGVyZXIgKigqKShBcmdzLi4uKT4gQ2FsbGJhY2tNYXA7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4Kc3RkOjptYXA8c3RkOjpzdHJpbmcsIElSZW5kZXJlciAqKCopKEFyZ3MuLi4pPiBNYXBIb2xkZXI8QXJncy4uLj46OkNhbGxiYWNrTWFwOwoKY2xhc3MgUmVuZGVyZXJGYWN0b3J5IHsKCXB1YmxpYzoKCXRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgoJc3RhdGljIHZvaWQgUmVnaXN0ZXJSZW5kZXJlcihzdGQ6OnN0cmluZyBuYW1lLCBJUmVuZGVyZXIgKigqQ2FsbGJhY2spKEFyZ3MuLi4pKSB7CgkJTWFwSG9sZGVyPEFyZ3MuLi4+OjpDYWxsYmFja01hcFtuYW1lXSA9IENhbGxiYWNrOwoJfQoKCXRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgoJc3RhdGljIElSZW5kZXJlciAqQ3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBBcmdzICYmLi4uIGFyZ3MpIHsKCQlyZXR1cm4gTWFwSG9sZGVyPEFyZ3MuLi4+OjpDYWxsYmFja01hcFtuYW1lXShzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwoJfQp9OwoKaW50IG1haW4oKSB7CglSZW5kZXJlckZhY3Rvcnk6OlJlZ2lzdGVyUmVuZGVyZXIoInVzZXIiLCAmVXNlclJlbmRlcmVyTXVsdGlBcmdzOjpDcmVhdGUpOwoJc3RkOjp1bmlxdWVfcHRyPElSZW5kZXJlcj4gcntSZW5kZXJlckZhY3Rvcnk6OkNyZWF0ZSgidXNlciIsIDQyLCAzKX07Cn0=