是否可以检测绑定成员函数引用的对象是否被删除或销毁

Mic*_*ell 2 c++ pointers bind function

我正在探索使用std::functionstd::bind.我看到你可以绑定一个成员函数,例如:

class A{
    int c_ = 10;
public:
    int add(int a, int b){
        return a + b + c_;
    }
};
int main(){
    A* p_a = new A;
    std::function<int()> f = std::bind(&A::add, p_a, 1, 1);
    printf("%i\n", f()); // yields "12" (1 + 1 + 10)
    delete p_a;
    printf("%i\n", f()); // yields derpy numbers, no errors thrown.
}
Run Code Online (Sandbox Code Playgroud)

有没有办法检测p_a是否已被删除?

我这样做的解决方案是拥有一个包装函数和包含weak_ptr对象的包装类.我只是想知道是否有一种更优雅的方式来做到这一点.

lis*_*rus 5

std::bind可以接受智能指针,所以你可以简单地传递std::shared_ptr<A>给它.

std::shared_ptr<A> p_a(new A);
std::function<int()> f = std::bind(&A::add, p_a, 1, 1);
Run Code Online (Sandbox Code Playgroud)

请注意,仿函数将拥有该对象:只要仿函数存在,对象就会存在.如果您不想要这样的行为,那么使用weak_ptr包装器的解决方案很好.