#include <iostream>
#include <functional>
#include <memory>
struct ACancelable {};
struct ACancelableToken {};
template<typename T, typename U>
class ANotifier : public ACancelable
{
public:
using NotificationFn = std::function<void(T&)>;
virtual std::weak_ptr<ACancelableToken> RegisterNotification( U msgType, NotificationFn fn ) = 0;
virtual void Notify( U msgType, T& value ) = 0;
};
template<typename T, typename U>
class ASingleNotifier : public ANotifier<T, U>
{
using NotificationFn = typename ANotifier<T,U>::NotificationFn;
virtual std::weak_ptr<ACancelableToken> RegisterNotification( U msgType, NotificationFn fn );
};
int main() {
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1lbW9yeT4KCnN0cnVjdCBBQ2FuY2VsYWJsZSB7fTsKc3RydWN0IEFDYW5jZWxhYmxlVG9rZW4ge307Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgpjbGFzcyBBTm90aWZpZXIgOiBwdWJsaWMgQUNhbmNlbGFibGUKewpwdWJsaWM6CiAgdXNpbmcgTm90aWZpY2F0aW9uRm4gPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoVCYpPjsKICB2aXJ0dWFsIHN0ZDo6d2Vha19wdHI8QUNhbmNlbGFibGVUb2tlbj4gUmVnaXN0ZXJOb3RpZmljYXRpb24oIFUgbXNnVHlwZSwgTm90aWZpY2F0aW9uRm4gZm4gKSA9IDA7CiAgdmlydHVhbCB2b2lkIE5vdGlmeSggVSBtc2dUeXBlLCBUJiB2YWx1ZSApID0gMDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CmNsYXNzIEFTaW5nbGVOb3RpZmllciA6IHB1YmxpYyBBTm90aWZpZXI8VCwgVT4KewogIHVzaW5nIE5vdGlmaWNhdGlvbkZuID0gdHlwZW5hbWUgQU5vdGlmaWVyPFQsVT46Ok5vdGlmaWNhdGlvbkZuOwogIHZpcnR1YWwgc3RkOjp3ZWFrX3B0cjxBQ2FuY2VsYWJsZVRva2VuPiBSZWdpc3Rlck5vdGlmaWNhdGlvbiggVSBtc2dUeXBlLCBOb3RpZmljYXRpb25GbiBmbiApOwp9OwoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==