#include
#include
// ------------------------------------------------------------------------------
using CallbackType = std::function;
// ------------------------------------------------------------------------------
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() {
try {
if (Begin) (*Begin)(this);
std::cout << "- Не отдам, слон - мой!\n";
if (End) (*End)(this);
} catch(const std::bad_function_call& E) {
std::cout << "Хреновый вызов: " << E.what() << '\n';
} catch(...) {
std::cout << "Случилось страшное!\n";
}
}
};
// ------------------------------------------------------------------------------
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;
}