Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- void function() {
- std::cout << "I am a function.\n";
- }
- class Object {
- int field;
- public:
- Object(int field = 0) : field(field) { };
- void method() {
- std::cout << "I am a method. I can access the field, which is currently " << field << ".\n";
- }
- };
- static void(*to_exec)();
- // функция, принимающая void(*)() с отложенным вызовом
- void set_exec(void (*f)()) {
- to_exec = f;
- }
- // отложенный вызов
- void trigger_exec() {
- to_exec();
- }
- // здесь нужно передать метод в качестве функции по указателю
- void wrap(Object &object) {
- // создаем локальную статическую ссылку на объект, метод которого передаем
- static Object &__static_temp = object;
- // передаем лямбду, которая вызывает метод объекта по ссылке
- set_exec([]() -> void { __static_temp.method(); });
- // т. к. ссылка статическая, ее время жизни не истекает при выходе из этой функции,
- // но важно передавать объект в этот метод по ссылке,
- // иначе при выходе из него истечет время жизни объекта и его полей
- // объект не должен быть уничтожен на момент отложенного вызова
- }
- int main() {
- // локальный объект
- Object obj(5);
- // вышеописанная функция
- wrap(obj);
- // действие, приводящее к отложенному вызову метода
- trigger_exec();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement