"Умный указатель" на member function объекта
От: MarcoPolo  
Дата: 14.02.20 13:14
Оценка:
Есть класс:

class A {
 public:
  A() {
    a = 1;
  };

  bool gt(int b) {
    return a > b;
  }
 
 private:
  int a;
};


Можно сделать callable из мембера объекта:

A theA;
std::function<bool(int)> f3 = std::bind(&A::gt, &theA, std::placeholders::_1);
std::cout << f3(42) << std::endl;


Проблема в том, что f3 не связан с точки зрения времени жизни с theA:
std::function<bool(int)> f3;
{

  A theA;
  f3 = std::bind(&A::gt, &theA, std::placeholders::_1);
}
std::cout << f3(42) << std::endl; // BANG


Если можно было бы сделать что-то в таком духе:
Допустим, объект класса A поступил нам в виде std::shared_ptr<A> a_ptr.
std::shared_ptr<A> a_ptr;
std::shared_ptr<std::function<bool(int)>> fun_ptr = some_lib::bind_member_function(&A::gt, a_ptr, , std::placeholders::_1);
...  
// Теперь fun_ptr ссылается хранит в себе еще один std::shared_ptr<A>, увеличивая количество ссылок на объект класса A на 1.
// Поэтому в месте использования можно быть уверенным, что fun_ptr->operator()(42) не взорвется.


Какие есть подходы к этой проблеме?
c++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.