如何将成员函数指针传递给采用常规函数指针的函数?

Yax*_*lat 4 c++ pointers function-pointers member-functions

我有一个如下所示的玩家类(精简为该问题所需的内容):

class Player
{
    public:
        Player();
        ~Player();

        void kill();
        void death();
        void reset();
};
Run Code Online (Sandbox Code Playgroud)

、和函数如下所示kill()death()reset()

void Player::kill()
{
    void (*dPtr)() = &death;

    Game::idle(dPtr, 48);
}

void Player::death()
{
    reset();
}

void Player::reset()
{
    //resets
}
Run Code Online (Sandbox Code Playgroud)

idle函数是Game的静态成员函数,它接受一个函数指针和一个整数n,并在n个tick后调用该函数。这是函数,实现应该不重要:

class Game {
    static void idle(void (*)(), int);
};
Run Code Online (Sandbox Code Playgroud)

这段代码给了我错误:

ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&Player::death' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

所以我改变了线路

    void (*dPtr)() = &death;
Run Code Online (Sandbox Code Playgroud)

    void (Player::*dPtr)() = &Player::death;
Run Code Online (Sandbox Code Playgroud)

来解决这个问题。但是我对空闲函数的调用是不正确的,因为它需要一个常规函数指针,并且我传递了一个成员函数指针,因此给出了错误:

no matching function for call to 'Game::idle(void (Player::*&)(), int)'
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何将成员函数指针传递到以 a作为参数的Player::*dPtr空闲函数中?void (*)()

或者是否有另一种方法可以解决我之前的错误,该错误禁止我获取不合格的成员函数的地址来形成指向成员函数的指针?

M.M*_*M.M 5

另一个答案提到你需要两个指针。然而,C++ 已经提供了用于执行此操作的容器,因此它将使您的代码使用起来更加简单。(在 C++03 中,以下一些std::项目是std::tr1::)。

示例代码:

#include <iostream>
#include <functional>

struct Game 
{ 
    static void idle( std::function<void()> func, int x )
        { std::cout << "x = " << x << "\n"; func(); }
};

struct Player
{
     void death() { std::cout << "player.death\n"; }
     void kill() { Game::idle( std::bind(&Player::death, this), 48 ); }
};

int main()
{
    Player p;
    p.kill();
}
Run Code Online (Sandbox Code Playgroud)

终身注释:std::bind按值绑定。使用意味着制作 的*this副本并将其存储在对象中,并根据需要与其一起复制。 Playerstd::function

usingthis意味着函数对象存储一个指针,因此如果您实际上将函数对象存储在 中,则Game::idle必须注意在从列表Player中删除该函数对象之前,它不会被销毁。Game::idle