#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();
}
