我应该如何在 C++ 中定义指向函数的指针数组?

How Should I Define an Array of Pointers to Functions in C++?

我正在尝试创建一个函数数组,以便我可以使用索引调用数组中的函数。我似乎无法弄清楚括号、星号和括号来创建这个函数数组。这是我拥有的:

void Game::getPawnMoves(int position, bool color, Move ** moveList) {
    ...
}

typedef void (*GetMoveFunction) (int, bool, Move **);
void Game::getLegalMoves(Move ** moveList) {
    GetMoveFunction functions[] = 
    {
        getPawnMoves, 
        getKnightMoves, 
        getBishopMoves,
        getRookMoves,
        getQueenMoves,
        getKingMoves
    };
    ...
}

所有 getPawnMoves、getKnightMoves 和其余的都具有相同的参数,并且所有 return 无效。 Move 只是一个包含两个字符和一个枚举的结构。在这种情况下,如果您想尝试编译它,可以将 Move ** 替换为 int **。

我在编译时遇到的错误是:

Game.cpp:443:5: error: cannot convert ‘Game::getPawnMoves’ from type 
‘void (Game::)(int, bool, Move**) {aka void (Game::)(int, bool, Move_t**)}’ to 
type ‘GetMoveFunction {aka void (*)(int, bool, Move_t**)}’

所以出于某种原因,编译器认为 GetMoveFunction 是 void * 而不是 void,但是如果我将 typedef 更改为

typedef void (GetMoveFunction) (int, bool, Move **);

我收到错误:

Game.cpp:435:28: error: declaration of ‘functions’ as array of functions
  GetMoveFunction functions[] = 

老实说,我非常喜欢这个。非常感谢您的帮助!

How Should I Define an Array of Pointers to Functions in C++?

typedef void (*GetMoveFunction) (int, bool, Move **);

这是一个指向函数的指针。

GetMoveFunction functions[] = 
{
    // ...
};

这是一个函数指针数组。您已经实现了问题标题中的要求。


Game.cpp:443:5: error: cannot convert ‘Game::getPawnMoves’ from type 
‘void (Game::)(int, bool, Move**) {aka void (Game::)(int, bool, Move_t**)}’ to 
type ‘GetMoveFunction {aka void (*)(int, bool, Move_t**)}’

这里的问题是您正在尝试使用 non-static 成员函数来初始化函数指针。函数指针不能指向 non-static 个成员函数。

您可能需要的是指向 Game 成员 函数的指针数组。另一种选择是类型擦除函数包装器数组 (std::function)。