C++ 指向成员函数的函数指针

Seb*_*een 0 c++

我有一个工作类,它在构造函数中接受回调函数指针初始化。我想在我的类中实例化worker,并提供一个指向成员函数的指针作为回调。

工人阶级:

class Worker
{
public:
    typedef int (*callFunct)(int);
    Worker(callFunct callback = nullptr);
    ~Worker();

private:
    callFunct m_callback = nullptr;
};

Worker::Worker(callFunct callback) : m_callback(callback)
{
}
Run Code Online (Sandbox Code Playgroud)

这是我的类,我希望在其中有Worker实例和成员回调函数:

class myClass
{
public:
    myClass();
    ~myClass() = default;

private:
    int myCallback(int x);
    Worker m_worker {&myClass::myCallback};
};
Run Code Online (Sandbox Code Playgroud)

不幸的是这不能编译:

    error: could not convert '{&myClass::myCallback}' from '<brace-enclosed initializer list>' to 'Worker'
Run Code Online (Sandbox Code Playgroud)

我知道在处理指向成员类的指针时,我还必须提供实例对象。但是,当我需要指向类成员的指针时,在这种情况下正确的做法是什么?

Som*_*ude 6

指向非成员函数的指针与指向(非静态)成员函数的指针不同!

区别在于(非静态)成员函数需要调用一个对象,而指向非成员函数的指针则不需要。

您可以使用std::functionlambda表达式来创建回调:

class Worker
{
public:
    using callFunct = std::function<int(int)>;

    Worker(callFunct callback)
        : m_callback(callback)
    {
    }

private:
    callFunct m_callback;
};

class myClass
{
public:
    myClass()
        : m_worker([this](int x) { return myCallback(x); })
    {
    }

private:
    int myCallback(int x);
    Worker m_worker;
};
Run Code Online (Sandbox Code Playgroud)

或者,如果回调不需要访问该myClass对象,则创建该函数static

class myClass
{
public:
    myClass();

private:
    static int myCallback(int x);
    Worker m_worker {&myClass::myCallback};
};
Run Code Online (Sandbox Code Playgroud)

[正如其他人在对该问题的评论中提到的]

或者一个简单的 lambda 可以完成该myClass::myCallback做的事情。