#include <functional>
#include <iostream>
#include <memory>

template <typename T>
struct Message
{
    T a;
};

template <typename T>
class Connection
{
  typedef std::function<void(Message<T>&)> msg_handle;

  public:
    void SetHandle(msg_handle handle)
    {
      handle_ = handle;
    }

    void Run()
    {
      Message<T> t;
      std::cout << "Run() from Connection" << std::endl;
      handle_(t);
    }

  private:
    msg_handle handle_;
};

template <typename T>
class Server
{
  public:
    void OnMessage(Message<T>& msg, std::shared_ptr<Connection<T>> remote)
    {
      std::cout << "OnMessage() from Server" << std::endl;
    }
};


int main()
{
  auto server = std::make_shared<Server<int>>();
  auto connection = std::make_shared<Connection<int>>();
  connection->SetHandle([=](auto& m){ server->OnMessage(m, connection); });
  connection->Run();
  return 0;
}