Я пишу программу на OpenGL, и будут собственные события, которые будут происходить, напр. когда игрок сталкивается с препятствием или делает шаг. Что я хочу сделать, это:
Имейте одноэлементный класс с именем что-то вроде «EventBroadcaster». Вещатель будет получать информацию о событиях по всей программе. Затем, когда он получает событие, он отправляет его всем слушателям (объектам «EventListener») с void *, содержащим структуру, которая содержит информацию о событии. Затем объекты EventListener могут использовать свою собственную функцию обратного вызова для обработки различных типов событий. Теперь я хочу избежать использования void *, если это возможно, так что …
…вопрос, как я могу сделать это с интерфейсом шаблона?
Приведение всех к void * и затем обратно подвержено ошибкам. Взгляни на повышение :: сигналы или несколько Другой библиотека сигналов / слотов. Это может помочь вам не выбрасывать информацию о типе.
Класс может открыть слот и затем вызвать его. Например, может быть слот, как 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();
}
}
};
Если все, что вы хотите сделать, это избежать сбрасывания информации о типе, потому что вы используете пустой указатель, вы можете посмотреть на повышение :: любой