1

アプリケーションの単純なキーバインドを作成しています。これまでのところ、2 つの配列 (bool m_keys[256]、string 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関数で

    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;
}
4

1 に答える 1

1

私の理解が正しければ、文字列から呼び出し可能な関数を取得しようとしています。C++ にはリフレクションが欠けているため、そうするのは現実的ではありません。使用できる代替手段がいくつかあります。

私の提案は、InputClass::functions配列に文字列ではなく関数ポインターを含めることです。AddFunc次に、文字列の代わりに関数アドレスを渡し、それに応じて指定された配列メンバーを設定できます。これは、非メンバー関数ではかなりうまく機能します。クラス インスタンスのメンバ関数を呼び出せるようにしたい場合は、 をInputClass::functionsの配列にして、 から返されたstd::functionファンクタを に渡します。std::bindAddFunc

于 2013-02-04T19:16:12.937 に答える