键绑定? (c)(将字符串转换为函数)

时间:2013-02-04 18:47:21

标签: c++ windows string casting keyboard

我正在为我的应用程序编写一个简单的键绑定。到目前为止,我有2个数组(bool m_keys [256],字符串m_functions)。

这是我的输入类(在input.h中)

class InputClass
{
public:

InputClass(){};
InputClass(const InputClass&){};
~InputClass(){};

void Initialize(){
    for(int i=0; i<256; i++)
    {
            m_keys[i] = false;
    functions[i] = "";
    }
}

bool AddFunc(unsigned int key, string func, bool overide)
{
      if((functions[key] == "") || (overide)){
      //overide is used to overide the current string (if there is one)
          functions[key] = func; 
          return true;
      } 
      return false;
    };

void KeyDown(unsigned int input){m_keys[input] = true;};

void KeyUp(unsigned int input){m_keys[input] = false;};

string IsKeyDown(unsigned int key){return m_keys[key] ? functions[key] : "";};

private:
    bool m_keys[256];
    string functions[256];
};

在我的WinARM.cpp中:

在我的初始化函数

    INIT(m_Input, InputClass) //#define INIT(o,c) if(!(o = new c))return false;
    m_Input->Initialize();
    m_Input->AddFunc(VK_RETURN,"m_Graphics->ToggleWireFrame",true);

在我的框架功能中(每一帧运行;)

short SystemClass::Frame()
{
string func;
func = m_Input->IsKeyDown(VK_RETURN); //checks to see if the enter key is down
if(func !="") (func as function)(); // <-- this is the code i need help with
if(m_Input->IsKeyDown(VK_F2)!="")m_Graphics->ToggleWireFrame();
if(!m_Graphics->Frame()) return -1;
return 1;
}

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你试图从字符串中获取可调用的函数。 C ++缺少reflection,所以这样做真的不可行。您可以使用一些替代方案。

我的建议是让你的InputClass::functions数组包含函数指针,而不是字符串。然后,您可以将函数地址传递给AddFunc而不是字符串,并相应地设置给定的数组成员。对于非成员函数,这将非常有效。如果您希望能够调用类实例的成员函数,我会将InputClass::functions设为std::function的数组,并将std::bind返回的仿函数传递给AddFunc