我知道有人问过这样的问题,但是没有一个答案对我有帮助。尽管我过去曾根据需要编写过一些C ++代码,但我一点也不熟练。今天,我被困在尝试将回调函数传递给另一个类中的函数。下面是一个简短的示例:
#include "stdafx.h"
#include <functional>
class A
{
private:
int _someMemberVar = 7;
public:
void SomeFunction(std::function<void(int)> func)
{
func(_someMemberVar);
}
};
class B
{
public:
void DoSomeWork()
{
A a;
// error C2275: 'std::function<void (int)>' : illegal use of this type as an expression
a.SomeFunction(std::function<void(int)> &B::MyCallback);
}
void MyCallback(int i)
{
printf("parameter is %d\r\n", i);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
B b;
b.DoSomeWork();
return 0;
}
我已经尝试过此std::function documentation页面中的示例代码,但无法编译。我发现的其他示例(例如dissertation here中的示例)也存在类似的问题。我正在使用Visual Studio 2013。
搜索各种编译器错误并没有帮助我解决这个问题,我感到沮丧和困惑。我唯一可以肯定的是,我们的C#程序员肯定被宠坏了。非常感谢您的帮助。
编辑:非常感谢大家的所有帮助。所有的答案都提供了一个可行的解决方案,如果我可以对它们进行绿色检查,我会尽力而为。我选择了super发布的答案,因为它解释最多,而且似乎与我要移植的内容最接近。再次感谢大家!
除了&B::MyCallback
(典型值)左括号之外,这里的主要问题是成员函数和普通函数不是同一件事。
成员函数作用在对象上,而函数没有作用,因此不能仅将指向成员函数的指针转换为普通函数指针。
在您的情况下,最直接的解决方案是传递捕获this
的lambda。
a.SomeFunction([&](int i){ MyCallback(i); });
lambda将捕获当前对象并将i
作为参数传递给成员函数。
逻辑上,您需要一个对象来调用回调函数。这是一种实现方法:
a.SomeFunction([this] (int const i) { MyCallback(i); });
这是做同一件事的另一种方法。假设您不想将方法更改为静态方法,并且要在MyCallback
]上调用this
方法
using namespace std::placeholders;
std::function<void(int)> func = std::bind(&B::MyCallback, this, _1);
a.SomeFunction(func);