看了这篇文章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,有机会再研究更多。