0

我正在为与我的朋友一起开发的游戏制作一个简单的开发者控制台。我正在将函数绑定到控制台,所以我有一个 std::map 包含一个字符串来保存我们将在控制台中调用它的名称,以及我自己定义的 MFP 类型,它是一个返回一个函数指针sf::String (我们使用的是 SFML,sf 是 SFML 命名空间),并将 sf::String 作为参数。所有控制台函数都接受一个 sf::String 并返回一个 sf::String。

这是有问题的代码的样子(不是所有代码):

#include <SFML/System/String.hpp>
using namespace sf;

#include <map>
#include <string>
using namespace std;

class CConsole
{
public:
    typedef sf::String (*MFP)(sf::String value);    //function pointer type

    void bindFunction(string name, MFP func);    //binds a function
    void unbindFunction(string name);    //unbinds desired function
private:
    map <string, MFP> functions;
}

现在这一切都很好,只要我们试图绑定到控制台的函数是全局命名空间的。但这行不通。不断地为我们想要绑定到控制台的每个嵌套函数创建全局包装函数太低效了。

是否有可能让“MFP”接受所有命名空间的函数指针?例如,让闲置的代码完美地工作?

#include "console.h"    //code shown above

//Let's also pretend CConsole has an sf::String(sf::String value) method called consoleFunc that returns "Hello from the CConsole namespace!"

sf::String globalFunc(sf::String value)
{
     return "Hello from the global namespace!";
}

int main()
{
    CConsole console;
    console->bindFunction("global", globalFunc);
    console->bindFunction("CConsole", CConsole::consoleFunc);
    return 0;
}
4

1 回答 1

0

在您的示例中,您可以调用bindFunction任何非成员函数或任何类的静态成员函数。您不能bindFunction使用非静态成员,因为它们具有不同的类型。

于 2013-05-16T11:21:47.333 回答