将回调函数指针传递给另一个类中的函数

问题描述 投票:0回答:3

我知道有人问过这样的问题,但是没有一个答案对我有帮助。尽管我过去曾根据需要编写过一些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发布的答案,因为它解释最多,而且似乎与我要移植的内容最接近。再次感谢大家!

c++ std-function
3个回答
2
投票

除了&B::MyCallback(典型值)左括号之外,这里的主要问题是成员函数和普通函数不是同一件事。

成员函数作用在对象上,而函数没有作用,因此不能仅将指向成员函数的指针转换为普通函数指针。

在您的情况下,最直接的解决方案是传递捕获this的lambda。

a.SomeFunction([&](int i){ MyCallback(i); });

lambda将捕获当前对象并将i作为参数传递给成员函数。


2
投票

逻辑上,您需要一个对象来调用回调函数。这是一种实现方法:

a.SomeFunction([this] (int const i) { MyCallback(i); });

2
投票

这是做同一件事的另一种方法。假设您不想将方法更改为静态方法,并且要在MyCallback]上调用this方法

using namespace std::placeholders;

    std::function<void(int)> func = std::bind(&B::MyCallback, this, _1);
    a.SomeFunction(func);
© www.soinside.com 2019 - 2024. All rights reserved.