#include <iostream>
#include <functional>
// ──────────────────────────────────────────────────────────────────────────────
using CallbackType = std::function<void(void*)>;
// ──────────────────────────────────────────────────────────────────────────────
class Karbofos {
CallbackType *Begin = nullptr;
CallbackType *End = nullptr;
public:
const std::string Name = "Карбофос";
void SetCallback(CallbackType *B, CallbackType *E) {
Begin = B;
End = E;
}
void Run() {
if (Begin) (*Begin)(this);
std::cout << "- Не отдам, слон - мой!\n";
if (End) (*End)(this);
}
};
// ──────────────────────────────────────────────────────────────────────────────
void Shef(void* i) {
std::cout << "- Стой, живодер " << ((Karbofos*)(i))->Name << "!\n";
}
// ──────────────────────────────────────────────────────────────────────────────
void Kollega(void* i) {
std::cout << "- " << ((Karbofos*)(i))->Name << ", ты немец и контрабандист!\n";
}
// ──────────────────────────────────────────────────────────────────────────────
int main() {
Karbofos Object;
CallbackType S = Shef;
CallbackType K = Kollega;
Object.SetCallback(&S,&K);
Object.Run();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKdXNpbmcgQ2FsbGJhY2tUeXBlID0gc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQqKT47CgovLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmNsYXNzIEthcmJvZm9zIHsKICAKICAgIENhbGxiYWNrVHlwZSAqQmVnaW4gPSBudWxscHRyOwogICAgQ2FsbGJhY2tUeXBlICpFbmQgPSBudWxscHRyOwogIAogIHB1YmxpYzoKICAKICAgIGNvbnN0IHN0ZDo6c3RyaW5nIE5hbWUgPSAi0JrQsNGA0LHQvtGE0L7RgSI7CiAgICAKICAgIHZvaWQgU2V0Q2FsbGJhY2soQ2FsbGJhY2tUeXBlICpCLCBDYWxsYmFja1R5cGUgKkUpIHsKICAgICAgQmVnaW4gPSBCOwogICAgICBFbmQgPSBFOwogICAgfQogICAgCiAgICB2b2lkIFJ1bigpIHsKICAgICAgaWYgKEJlZ2luKSAoKkJlZ2luKSh0aGlzKTsKICAgICAgc3RkOjpjb3V0IDw8ICItINCd0LUg0L7RgtC00LDQvCwg0YHQu9C+0L0gLSDQvNC+0LkhXG4iOwogICAgICBpZiAoRW5kKSAoKkVuZCkodGhpcyk7CiAgICB9CiAgICAKfTsKCi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKdm9pZCBTaGVmKHZvaWQqIGkpIHsKICBzdGQ6OmNvdXQgPDwgIi0g0KHRgtC+0LksINC20LjQstC+0LTQtdGAICIgPDwgKChLYXJib2ZvcyopKGkpKS0+TmFtZSA8PCAiIVxuIjsJCn0KCi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKdm9pZCBLb2xsZWdhKHZvaWQqIGkpIHsKICBzdGQ6OmNvdXQgPDwgIi0gIiA8PCAoKEthcmJvZm9zKikoaSkpLT5OYW1lIDw8ICIsINGC0Ysg0L3QtdC80LXRhiDQuCDQutC+0L3RgtGA0LDQsdCw0L3QtNC40YHRgiFcbiI7CQp9CgovLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmludCBtYWluKCkgewogIEthcmJvZm9zIE9iamVjdDsJCiAgQ2FsbGJhY2tUeXBlIFMgPSBTaGVmOwogIENhbGxiYWNrVHlwZSBLID0gS29sbGVnYTsKICBPYmplY3QuU2V0Q2FsbGJhY2soJlMsJkspOwogIE9iamVjdC5SdW4oKTsKICByZXR1cm4gMDsKfQ==