我正在制作一个简单的开发者控制台,用于我正在和我的一个朋友一起工作的游戏。我正在将函数绑定到控制台,所以我有一个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;
}
答案 0 :(得分:0)
在您的示例中,您可以在任何非成员函数或任何类的静态成员函数上调用bindFunction
。您不能bindFunction
使用非静态成员,因为它们具有不同的类型。