将回调函数指针传递给另一个 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);