2017-12-04 4 views
0

関数のベクトルにPlayerクラスのメンバ関数を追加しようとしています。非標準構文。メンバ関数をベクトルに代入するときに '&'を使用してメンバエラーへのポインタを作成します

これはパラメータとしてKeyboard :: Keyを必要とする関数のベクトルです。

vector<function<void(Keyboard::Key)>> KeyEvent; 

は、それから私は私が何かコードsimilairはメンバ関数で正常に動作しますが、ない他のインスタンスを持って

Player::Player() { 
    KeyEvent.push_back(OnKey); //error: non-standard syntax; use '&' to create a pointer to member 
} 

void Player::OnKey(Keyboard::Key key) { 
    //do something with key... 
} 

プレーヤーの実装を持っています。

vector<function<void()>> UpdateEvent; 

UpdateEvent.push_back(HandleInputUpdate); 

void HandleInputUpdate() { 
    for (size_t i = 0; i < pressedKeys.size(); i++) { 
     for (size_t e = 0; e < KeyEvent.size(); e++) { 
      KeyEvent[e](pressedKeys[i]); 
     } 
    } 
} 
メンバ関数をこのベクトルに追加することはできますか?そうでない場合、私は何かsimilairを作成できますか?私はC++を非常に新しくしており、C#のアクションを複製できるようにベクターを作成しました。これは私が問題に遭遇するまで私が来たところです。これは早い段階のコンセプトですが、まだベクトルから関数を削除する方法を追加する必要があります。
+0

申し訳ありませんが、&Onkeyを使用すると、残念ながら別のエラーが発生します: '&':バウンドメンバー関数式では不正な操作です。 –

答えて

1

OnKeyPlayerの非静的メンバ関数であり、したがってに呼び出されるPlayerのインスタンスを必要とします。ポインタをメンバ関数の構文にする権利があっても、自動バインディングが存在しないため、この問題は解決しません。つまり、thisが指し示すインスタンスは、ではなく、std::function<void(Keyboard::Key)>として使用可能な呼び出し可能オブジェクトを生成するために自動的に使用されません。

KeyEvent.push_back([this](auto key) { OnKey(key); }); 

機能でOnKey(key);呼び出しがthis->OnKey(key);と同等です:

あなたがここで何をしたい達成するための非常に簡単な方法は、ラムダを使用することです。


より複雑な(私の意見では)方法はstd::bindを使用することです:

一般ラムダと近代的なC++で std::functionで、話す、メンバ関数へのポインタのためのユースケースは非常になってきた
using namespace std::placeholders; 
KeyEvent.push_back(std::bind(&Player::OnKey, this, _1)); 

まれな

0

UsePlayer :: OnKey(OnKeyまたは単に& OnKkeyを持つ)は、メンバーへのポインタの状況では不十分です。

0

Is it possible to add an a member function to this vector

いいえ非静的メンバー関数ポインタは、非メンバー関数ポインタと静的メンバー関数ポインタとはかなり異なります。

and if not, how could I create something similair?

ラムダ式を使用してください。ラムダ式では、thisポインタをキャプチャして関数呼び出しで使用するようにしてください。

KeyEvent.push_back([this](Keyboard::Key key) {this->OnKey(key);}); 
+0

私はバグがあると思います:ラムダ関数は何も返さないはずです。 –

+0

@ChristianHackl、エラーを指摘してくれてありがとう。 –

関連する問題