#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;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1lbW9yeT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgTWVzc2FnZQp7CiAgICBUIGE7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgQ29ubmVjdGlvbgp7CiAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoTWVzc2FnZTxUPiYpPiBtc2dfaGFuZGxlOwoKICBwdWJsaWM6CiAgICB2b2lkIFNldEhhbmRsZShtc2dfaGFuZGxlIGhhbmRsZSkKICAgIHsKICAgICAgaGFuZGxlXyA9IGhhbmRsZTsKICAgIH0KCiAgICB2b2lkIFJ1bigpCiAgICB7CiAgICAgIE1lc3NhZ2U8VD4gdDsKICAgICAgc3RkOjpjb3V0IDw8ICJSdW4oKSBmcm9tIENvbm5lY3Rpb24iIDw8IHN0ZDo6ZW5kbDsKICAgICAgaGFuZGxlXyh0KTsKICAgIH0KCiAgcHJpdmF0ZToKICAgIG1zZ19oYW5kbGUgaGFuZGxlXzsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBTZXJ2ZXIKewogIHB1YmxpYzoKICAgIHZvaWQgT25NZXNzYWdlKE1lc3NhZ2U8VD4mIG1zZywgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb248VD4+IHJlbW90ZSkKICAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJPbk1lc3NhZ2UoKSBmcm9tIFNlcnZlciIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKCmludCBtYWluKCkKewogIGF1dG8gc2VydmVyID0gc3RkOjptYWtlX3NoYXJlZDxTZXJ2ZXI8aW50Pj4oKTsKICBhdXRvIGNvbm5lY3Rpb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbm5lY3Rpb248aW50Pj4oKTsKICBjb25uZWN0aW9uLT5TZXRIYW5kbGUoWz1dKGF1dG8mIG0peyBzZXJ2ZXItPk9uTWVzc2FnZShtLCBjb25uZWN0aW9uKTsgfSk7CiAgY29ubmVjdGlvbi0+UnVuKCk7CiAgcmV0dXJuIDA7Cn0=