将回调函数指针传递给另一个 class 中的函数
Passing a callback function pointer to a function in another class
我知道有人问过这样的问题,但是 none 的答案对我有帮助。尽管我过去曾根据需要编写过一些 C++ 代码,但我一点也不流利。今天,我一直在尝试将回调函数传递给另一个 class 中的函数。下面是一个简短的例子:
#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 page, but it doesn't compile. I had similar issues with other examples I found, such as those in the dissertation here 中的示例代码。我正在使用 Visual Studio 2013.
谷歌搜索各种编译器错误并没有帮助我解决这个问题,我感到沮丧和困惑。我唯一确定的是,我们 C# 程序员肯定被宠坏了。非常感谢任何帮助。
编辑:非常感谢大家的帮助。所有的答案都提供了一个可行的解决方案,如果我可以将它们全部绿色选中,我会的。我选择了 super 发布的答案,因为它有最多的解释并且似乎最接近我正在移植的内容。再次感谢大家!
逻辑上,你需要一个对象来调用回调函数。这是一种方法:
a.SomeFunction([this] (int const i) { MyCallback(i); });
除了 &B::MyCallback
周围缺少括号(打字错误?),这里的主要问题是成员函数和普通函数不是一回事。
成员函数作用于对象,而函数不作用于对象,因此指向成员函数的指针不能直接转换为普通函数指针。
在您的情况下,最直接的解决方案是传递捕获 this
.
的 lambda
a.SomeFunction([&](int i){ MyCallback(i); });
lambda 将捕获当前对象并将i
作为参数转发给成员函数。
这是做同样事情的另一种方法。假设您不想将方法更改为静态方法,并且想在 this
上调用 MyCallback
方法
using namespace std::placeholders;
std::function<void(int)> func = std::bind(&B::MyCallback, this, _1);
a.SomeFunction(func);
我知道有人问过这样的问题,但是 none 的答案对我有帮助。尽管我过去曾根据需要编写过一些 C++ 代码,但我一点也不流利。今天,我一直在尝试将回调函数传递给另一个 class 中的函数。下面是一个简短的例子:
#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 page, but it doesn't compile. I had similar issues with other examples I found, such as those in the dissertation here 中的示例代码。我正在使用 Visual Studio 2013.
谷歌搜索各种编译器错误并没有帮助我解决这个问题,我感到沮丧和困惑。我唯一确定的是,我们 C# 程序员肯定被宠坏了。非常感谢任何帮助。
编辑:非常感谢大家的帮助。所有的答案都提供了一个可行的解决方案,如果我可以将它们全部绿色选中,我会的。我选择了 super 发布的答案,因为它有最多的解释并且似乎最接近我正在移植的内容。再次感谢大家!
逻辑上,你需要一个对象来调用回调函数。这是一种方法:
a.SomeFunction([this] (int const i) { MyCallback(i); });
除了 &B::MyCallback
周围缺少括号(打字错误?),这里的主要问题是成员函数和普通函数不是一回事。
成员函数作用于对象,而函数不作用于对象,因此指向成员函数的指针不能直接转换为普通函数指针。
在您的情况下,最直接的解决方案是传递捕获 this
.
a.SomeFunction([&](int i){ MyCallback(i); });
lambda 将捕获当前对象并将i
作为参数转发给成员函数。
这是做同样事情的另一种方法。假设您不想将方法更改为静态方法,并且想在 this
MyCallback
方法
using namespace std::placeholders;
std::function<void(int)> func = std::bind(&B::MyCallback, this, _1);
a.SomeFunction(func);