定义未指定名称空间的函数指针

时间:2013-05-16 11:16:08

标签: c++ function pointers namespaces global

我正在制作一个简单的开发者控制台,用于我正在和我的一个朋友一起工作的游戏。我正在将函数绑定到控制台,所以我有一个std :: map,其中包含一个字符串,用于保存我们将在控制台中调用它的名称,以及我自己定义的MFP类型,它是一个返回a的函数指针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;
}

1 个答案:

答案 0 :(得分:0)

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