Advertisement
dreadmachine

passing_shit_back_and_forth.cpp

Dec 15th, 2021
1,676
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. void function() {
  4.   std::cout << "I am a function.\n";
  5. }
  6.  
  7. class Object {
  8.   int field;
  9. public:
  10.   Object(int field = 0) : field(field) { };
  11.   void method() {
  12.     std::cout << "I am a method. I can access the field, which is currently " << field << ".\n";
  13.   }
  14. };
  15.  
  16.  
  17. static void(*to_exec)();
  18.  
  19. // функция, принимающая void(*)() с отложенным вызовом
  20. void set_exec(void (*f)()) {
  21.   to_exec = f;
  22. }
  23.  
  24. // отложенный вызов
  25. void trigger_exec() {
  26.   to_exec();
  27. }
  28.  
  29. // здесь нужно передать метод в качестве функции по указателю
  30. void wrap(Object &object) {
  31.   // создаем локальную статическую ссылку на объект, метод которого передаем
  32.   static Object &__static_temp = object;
  33.   // передаем лямбду, которая вызывает метод объекта по ссылке
  34.   set_exec([]() -> void { __static_temp.method(); });
  35.   // т. к. ссылка статическая, ее время жизни не истекает при выходе из этой функции,
  36.   // но важно передавать объект в этот метод по ссылке,
  37.   // иначе при выходе из него истечет время жизни объекта и его полей
  38.   // объект не должен быть уничтожен на момент отложенного вызова
  39. }
  40.  
  41. int main() {
  42.   // локальный объект
  43.   Object obj(5);
  44.   // вышеописанная функция
  45.   wrap(obj);
  46.   // действие, приводящее к отложенному вызову метода
  47.   trigger_exec();
  48. }
  49.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement