#include <iostream>
#include <functional>
#include <memory>
using namespace std;
struct connection;
struct login;
struct huin;
typedef shared_ptr<connection> connection_ptr;
typedef shared_ptr<login> login_ptr;
typedef shared_ptr<huin> huin_ptr;
struct login {
static void on_message(const connection_ptr& , const login_ptr message ) {
}
};
struct huin {
static void on_message(const connection_ptr& , const huin_ptr message ) {
}
};
template<class T>
void register_yoba() {
connection_ptr a;
shared_ptr<T> b;
[&](){T::on_message(a, b);};
}
int main() {
register_yoba<login>();
register_yoba<huin>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1lbW9yeT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBjb25uZWN0aW9uOwpzdHJ1Y3QgbG9naW47CnN0cnVjdCBodWluOwoKdHlwZWRlZiBzaGFyZWRfcHRyPGNvbm5lY3Rpb24+IGNvbm5lY3Rpb25fcHRyOwp0eXBlZGVmIHNoYXJlZF9wdHI8bG9naW4+IGxvZ2luX3B0cjsKdHlwZWRlZiBzaGFyZWRfcHRyPGh1aW4+IGh1aW5fcHRyOwoKc3RydWN0IGxvZ2luIHsKCXN0YXRpYyB2b2lkIG9uX21lc3NhZ2UoY29uc3QgY29ubmVjdGlvbl9wdHImICwgY29uc3QgbG9naW5fcHRyIG1lc3NhZ2UgKSB7Cgl9Cn07CnN0cnVjdCBodWluIHsKCXN0YXRpYyB2b2lkIG9uX21lc3NhZ2UoY29uc3QgY29ubmVjdGlvbl9wdHImICwgY29uc3QgaHVpbl9wdHIgbWVzc2FnZSApIHsKCX0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgcmVnaXN0ZXJfeW9iYSgpIHsKCWNvbm5lY3Rpb25fcHRyIGE7CglzaGFyZWRfcHRyPFQ+IGI7CglbJl0oKXtUOjpvbl9tZXNzYWdlKGEsIGIpO307Cn0KCgppbnQgbWFpbigpIHsKCXJlZ2lzdGVyX3lvYmE8bG9naW4+KCk7CglyZWdpc3Rlcl95b2JhPGh1aW4+KCk7CglyZXR1cm4gMDsKfQ==