#include <string>
#include <functional>
#include <iostream>
class Deserializer
{
public:
int getInt() { return 10; }
std::string getString() { return "test"; }
};
template<typename T>
T get_value(Deserializer&);
template<>
int get_value(Deserializer& d)
{
return d.getInt();
}
template<>
std::string get_value(Deserializer& d)
{
return d.getString();
}
template<typename... Args>
class Dispatcher
{
public:
template<typename Functor>
Dispatcher(Deserializer& d, const Functor& cb) : myDeserializer(d), callback(cb)
{
}
void dispatch()
{
callback(get_value<Args>(myDeserializer)...);
}
private:
std::function<void(Args...)> callback;
Deserializer myDeserializer;
};
void cb(int a, int b, std::string c)
{
std::cout << a << " " << b << " " << c << std::endl;
}
int main()
{
Deserializer d;
Dispatcher<int, int, std::string> dispatcher(d, cb);
dispatcher.dispatch();
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIERlc2VyaWFsaXplcgp7CnB1YmxpYzoKICAgaW50IGdldEludCgpIHsgcmV0dXJuIDEwOyB9CiAgIHN0ZDo6c3RyaW5nIGdldFN0cmluZygpIHsgcmV0dXJuICJ0ZXN0IjsgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCBnZXRfdmFsdWUoRGVzZXJpYWxpemVyJik7Cgp0ZW1wbGF0ZTw+CmludCBnZXRfdmFsdWUoRGVzZXJpYWxpemVyJiBkKQp7CiAgIHJldHVybiBkLmdldEludCgpOwp9Cgp0ZW1wbGF0ZTw+CnN0ZDo6c3RyaW5nIGdldF92YWx1ZShEZXNlcmlhbGl6ZXImIGQpCnsKICAgcmV0dXJuIGQuZ2V0U3RyaW5nKCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CmNsYXNzIERpc3BhdGNoZXIKewpwdWJsaWM6CiAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CiAgIERpc3BhdGNoZXIoRGVzZXJpYWxpemVyJiBkLCBjb25zdCBGdW5jdG9yJiBjYikgOiBteURlc2VyaWFsaXplcihkKSwgY2FsbGJhY2soY2IpCiAgIHsKICAgfQogICB2b2lkIGRpc3BhdGNoKCkKICAgewogICAgICBjYWxsYmFjayhnZXRfdmFsdWU8QXJncz4obXlEZXNlcmlhbGl6ZXIpLi4uKTsKICAgfQpwcml2YXRlOgogICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQXJncy4uLik+IGNhbGxiYWNrOwogICBEZXNlcmlhbGl6ZXIgbXlEZXNlcmlhbGl6ZXI7Cn07Cgp2b2lkIGNiKGludCBhLCBpbnQgYiwgc3RkOjpzdHJpbmcgYykgCnsKICAgc3RkOjpjb3V0IDw8IGEgPDwgIiAiIDw8IGIgPDwgIiAiIDw8IGMgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgRGVzZXJpYWxpemVyIGQ7CiAgIERpc3BhdGNoZXI8aW50LCBpbnQsIHN0ZDo6c3RyaW5nPiBkaXNwYXRjaGVyKGQsIGNiKTsKICAgZGlzcGF0Y2hlci5kaXNwYXRjaCgpOwp9Cg==