1

私はOpenGLでプログラムを書いていますが、カスタムイベントが発生します。プレイヤーが障害物にぶつかったり、一歩踏み出したとき。私がやりたいことは:

「EventBroadcaster」のような名前のシングルトンクラスがあります。放送局は、番組周辺からフィードイベントを受け取ります。次に、イベントを受信すると、イベントの情報を保持する構造体を含むvoid *を使用して、すべてのリスナー( "EventListener"オブジェクト)にイベントを送信します。その後、EventListenerオブジェクトは、独自のカスタムコールバック関数を使用して、さまざまなタイプのイベントを処理できます。さて、可能であればvoid *の使用は避けたいので、...

...質問は、テンプレートインターフェイスでこれを行うにはどうすればよいですか?

4

2 に答える 2

2

voidポインターを使用しているために型情報が破棄されないようにするだけの場合は、boost::anyを確認することをお勧めします。

于 2012-12-13T23:30:56.573 に答える
1

すべてをvoid*にキャストしてから元に戻すと、エラーが発生しやすくなります。boost::signalsまたはその他のシグナル/スロットライブラリを見てください。タイプ情報を捨てないようにするのに役立つかもしれません。

クラスはスロットを公開してから呼び出すことができます。たとえば、のようなスロットがある可能性がありますvoid PlayerMovedTo( Point position )。他のクラスはそのスロットに接続でき、シグナルが送信されたときに通知されます。

信号/スロットメカニズムが一般的にどのように機能するかについての大まかなスケッチを次に示します。

class Game {
public:
  Signal<void (float, float)> PlayerMovedTo;

  void update() {
    if ( downKeyPressed ) {
       y += 10;
       PlayerMovedTo( x, y ); // Tell everyone about it
    }
  }
};


class Mine {
public:
  Mine() {
    // There can be many mines, all connected to the one signal.
    game.PlayerMovedTo.connect( this, &Mine::playerMoved );
  }

  void playerMoved( float x, float y ) {
    if ( distance( this->x, this->y, x, y ) < 10 ) {
      boom();
    }
  }
}; 
于 2012-12-13T23:47:12.883 に答える