看了这篇文章https://blog.nowcoder.net/n/29a27fd6a5cd481b99739a40f3a62816
图片说明
  有可能会发出疑问,既然foo.print做为参数是错误的表达,那我能不能直接用&Foo::print去当参数传递给std::function,答案是不行的,会出现参数不匹配的情况。为什么会出现参数不匹配呢?因为Foo::print是类成员函数,需要一个对象去调用,意识到成员函数和非成员函数的区别是很重要的,成员函数使用的调用约定叫作__thiscall,调用它的时候,一定要先指定其类的一个实例。所以std::function的参数必须有一个Foo对象才能参数匹配正确。如下代码,就能正确编译通过:

#include <functional>

class Foo
{
public:
    /*void operator()(void)
    {
        std::cout << "__FUNCTION__" << std::endl;
    }*/
    void print()
    {
        std::cout << "__FUNCTION__" << std::endl;
    }
};

class A
{
    std::function<void(Foo&)> m_callback;
public:
    A(const std::function<void(Foo&)>& f) : m_callback(f) {}

    void notify(Foo& foo)
    {
        m_callback(foo);
    }
};

int main(void)
{
    Foo foo;
    A a(&Foo::print);
    //std::function<void(Foo&)>fr = &Foo::print;
    //A aa(fr);
    //std::function<void()> fr = std::bind(&Foo::print, foo);
    //A aa(fr);
    a.notify(foo);
    return 0;
}

或者我们可以用如下代码显式绑定调用,fr是std::function,参数为Foo对象

std::function<void(Foo&)>fr = &Foo::print;
fr(foo);

或用std::bind来绑定一个对象和成员函数(这种做法比较常用,也比较清楚)赋值给一个std::function

std::function<void(Foo&)> fr = std::bind(&Foo::print, foo);
fr();

这个std::function的参数就是: 返回值为对象指针的无参函数类型

图片说明
关于std::bind,有机会再研究更多。