Есть класс:
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) не взорвется.
Какие есть подходы к этой проблеме?