这是一个很好的设计选择吗?

时间:2012-12-13 22:47:40

标签: c++ templates void-pointers

我正在用OpenGL编写程序,并且将会发生将要发生的自定义事件,例如。当球员遇到障碍物或迈出一步时。我想做的是:

有一个名为“EventBroadcaster”的单例类。该广播公司将从该计划周围获得美联储的活动。然后,当它收到一个事件时,它会将它发送给所有的侦听器(“EventListener”对象),其中void *包含一个保存事件信息的结构。然后,EventListener对象可以使用自己的自定义回调函数来处理不同类型的事件。现在,我想避免使用void *,如果可能的话,那么......

...问题是,如何使用模板界面执行此操作?

2 个答案:

答案 0 :(得分:2)

如果您只想避免因为使用空指针而丢弃类型信息,那么您可能需要查看boost::any

答案 1 :(得分:1)

将所有内容转换为void *然后返回是容易出错的。查看boost::signals或某些other信号/插槽库。它可以帮助您避免丢弃类型信息。

类可以公开插槽然后调用它。例如,可能有像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();
    }
  }
};