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

京公网安备 11010502036488号