#include <iostream>
struct Base
{
void beginEvent(int a)
{
impl(a, &Base::onBeginEvent, &Base::onBeginEvent);
}
void endEvent(int a)
{
impl(a, &Base::onEndEvent, &Base::onEndEvent);
}
void impl(int a, void (Base::*func1)(int), void (Base::*func2)(int, int))
{
(this->*func1)(a);
(this->*func2)(a, -a);
}
virtual void onBeginEvent(int a){}
virtual void onBeginEvent(int a, int negativeA){}
virtual void onEndEvent(int a){}
virtual void onEndEvent(int a, int negativeA){}
};
struct Derived : public Base
{
void onBeginEvent(int a) { std::cout << a << "\n"; }
void onEndEvent(int a, int b) { std::cout << a << "==(-(" << b << "))\n"; }
};
int main()
{
Derived d;
d.beginEvent(3);
d.endEvent(9);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2UKewogICAgdm9pZCBiZWdpbkV2ZW50KGludCBhKQogICAgewogICAgICAgIGltcGwoYSwgJkJhc2U6Om9uQmVnaW5FdmVudCwgJkJhc2U6Om9uQmVnaW5FdmVudCk7CiAgICB9CgogICAgdm9pZCBlbmRFdmVudChpbnQgYSkKICAgIHsKICAgICAgICBpbXBsKGEsICZCYXNlOjpvbkVuZEV2ZW50LCAmQmFzZTo6b25FbmRFdmVudCk7CiAgICB9CgogICAgdm9pZCBpbXBsKGludCBhLCB2b2lkIChCYXNlOjoqZnVuYzEpKGludCksIHZvaWQgKEJhc2U6OipmdW5jMikoaW50LCBpbnQpKQogICAgewogICAgICAgICh0aGlzLT4qZnVuYzEpKGEpOwogICAgICAgICh0aGlzLT4qZnVuYzIpKGEsIC1hKTsKICAgIH0KCiAgICB2aXJ0dWFsIHZvaWQgb25CZWdpbkV2ZW50KGludCBhKXt9CiAgICB2aXJ0dWFsIHZvaWQgb25CZWdpbkV2ZW50KGludCBhLCBpbnQgbmVnYXRpdmVBKXt9CiAgICB2aXJ0dWFsIHZvaWQgb25FbmRFdmVudChpbnQgYSl7fQogICAgdmlydHVhbCB2b2lkIG9uRW5kRXZlbnQoaW50IGEsIGludCBuZWdhdGl2ZUEpe30KfTsKCnN0cnVjdCBEZXJpdmVkIDogcHVibGljIEJhc2UKewogICAgdm9pZCBvbkJlZ2luRXZlbnQoaW50IGEpIHsgc3RkOjpjb3V0IDw8IGEgPDwgIlxuIjsgfQogICAgdm9pZCBvbkVuZEV2ZW50KGludCBhLCBpbnQgYikgeyBzdGQ6OmNvdXQgPDwgYSA8PCAiPT0oLSgiIDw8IGIgPDwgIikpXG4iOyB9Cn07CgppbnQgbWFpbigpIAp7CiAgICBEZXJpdmVkIGQ7CgogICAgZC5iZWdpbkV2ZW50KDMpOwogICAgZC5lbmRFdmVudCg5KTsKCglyZXR1cm4gMDsKfQ==