#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(Shef,Kollega);
Object.Run();
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogICAgIAogICAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgCiAgICB1c2luZyBDYWxsYmFja1R5cGUgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCopPjsKICAgICAKICAgIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIAogICAgY2xhc3MgS2FyYm9mb3MgewogICAgIAogICAgICAgIENhbGxiYWNrVHlwZSBCZWdpbiA9IG51bGxwdHI7CiAgICAgICAgQ2FsbGJhY2tUeXBlIEVuZCA9IG51bGxwdHI7CiAgICAgCiAgICAgIHB1YmxpYzoKICAgICAKICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBOYW1lID0gItCa0LDRgNCx0L7RhNC+0YEiOwogICAgIAogICAgICAgIHZvaWQgU2V0Q2FsbGJhY2soQ2FsbGJhY2tUeXBlIEIsIENhbGxiYWNrVHlwZSBFKSB7CiAgICAgICAgICBCZWdpbiA9IEI7CiAgICAgICAgICBFbmQgPSBFOwogICAgICAgIH0KICAgICAKICAgICAgICB2b2lkIFJ1bigpIHsKICAgICAgICAgIGlmIChCZWdpbikgKEJlZ2luKSh0aGlzKTsKICAgICAgICAgIHN0ZDo6Y291dCA8PCAiLSDQndC1INC+0YLQtNCw0LwsINGB0LvQvtC9IC0g0LzQvtC5IVxuIjsKICAgICAgICAgIGlmIChFbmQpIChFbmQpKHRoaXMpOwogICAgICAgIH0KICAgICAKICAgIH07CiAgICAgCiAgICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAKICAgIHZvaWQgU2hlZih2b2lkKiBpKSB7CiAgICAgIHN0ZDo6Y291dCA8PCAiLSDQodGC0L7QuSwg0LbQuNCy0L7QtNC10YAgIiA8PCAoKEthcmJvZm9zKikoaSkpLT5OYW1lIDw8ICIhXG4iOwkKICAgIH0KICAgICAKICAgIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIAogICAgdm9pZCBLb2xsZWdhKHZvaWQqIGkpIHsKICAgICAgc3RkOjpjb3V0IDw8ICItICIgPDwgKChLYXJib2ZvcyopKGkpKS0+TmFtZSA8PCAiLCDRgtGLINC90LXQvNC10YYg0Lgg0LrQvtC90YLRgNCw0LHQsNC90LTQuNGB0YIhXG4iOwkKICAgIH0KICAgICAKICAgIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIAogICAgaW50IG1haW4oKSB7CiAgICAgIEthcmJvZm9zIE9iamVjdDsJCiAgICAgIC8vQ2FsbGJhY2tUeXBlIFMgPSBTaGVmOwogICAgICAvL0NhbGxiYWNrVHlwZSBLID0gS29sbGVnYTsKICAgICAgT2JqZWN0LlNldENhbGxiYWNrKFNoZWYsS29sbGVnYSk7CiAgICAgIE9iamVjdC5SdW4oKTsKICAgICAgcmV0dXJuIDA7CiAgICB9