3

我昨天才弄清楚函数指针,我正在游戏引擎中实现控制台/命令系统。

我认为使用带有字符串键和函数指针值的映射将消除在运行命令时选择要做什么时对大量 if 语句的需要。

我收到此错误:

argument of type
    "void (Game::*)(std::string prop, std::string param)"
is incompatible with parameter of type
    "void (*)(std::string prop, std::string param)"

现在我想我知道这意味着什么了。我可以使用静态函数来解决这个问题,但我希望能够引用Game.

然而,函数指针映射必须能够指向任何具有返回 void 和 2 个字符串参数的函数。

首先这可能吗?

如果不是,是否可以通过静态成员函数修改实例变量?我对此不抱太大希望。

一如既往地感谢任何帮助。

4

2 回答 2

5

函数指针很糟糕。除非您绝对被迫,否则永远不要使用它们。相反,更喜欢std::function<void(std::string, std::string)>std::bind/lambdas。与函数指针不同,它们可以与任何函数对象一起使用,包括绑定的成员函数。

std::unordered_map<std::string, std::function<void()>> command_map;
Game game;
Help helper;
command_map["quit"] = [] { exit(); };
command_map["play"] = [&] { game.play(); };
command_map["help"] = [&] { helper.help(); };
于 2012-08-05T10:14:09.567 回答
1

您可以在映射中放置一个对象和一个函数指针。然后调用函数的静态版本,它只调用传入对象的函数的真实版本。您可以对任意数量的函数重复此操作Game

class Game
{
    void yourFunc1(std::string prop, std::string param)
    {
        // do stuff
    }

    void yourFunc1_static(Game* g, std::string prop, std::string param)
    {
        g->yourFunc1( prop, param );
    }
};

struct MapEntry
{
    Game* game;
    void (*func)(std::string prop, std::string param);
};

std::map<key_type, MapEntry> _map;
...
_map[key].func( game, "prop", "param" );
于 2012-08-05T09:58:57.323 回答