Sistema de mensagens: retornos de chamada podem ser qualquer coisa
Estou tentando escrever um sistema de eventos para o meu jogo. Os retornos de chamada que meu gerente de eventos armazenará podem ser tanto funções simples quanto functores. Também preciso comparar funções / functors para saber qual deles devo desconectar do gerenciador de evento
• Inicialmente tentei usar a função boost ::; ele lida perfeitamente com funções e functores, exceto que não possui operador ==, portanto, não posso remover retornos de chamada se assim o deseja
class EventManager
{
typedef boost::function<void (boost::weak_ptr<Event>)> Callback;
std::map<Event::Type, std::vector<Callback>> eventHandlerMap_;
};
• Também tentei usar o boost :: signal, mas isso também me deu um problema de compilação relacionado ao operador ==:
binary '==': nenhum operador encontrado que utilize um operando do lado esquerdo do tipo 'const Functor' (ou não há conversão aceitável)
void test(int c) {
std::cout << "test(" << c << ")";
}
struct Functor
{
void operator()(int g) {
std::cout << "Functor::operator(" << g << ")";
}
};
int main()
{
boost::signal<void (int)> sig;
Functor f;
sig.connect(test);
sig.connect(f);
sig(7);
sig.disconnect(f); // Error
}
Alguma outra sugestão sobre como eu posso implementar isso? Ou talvez, como eu possa fazer o sinal boost :: function ou boost :: signal funcionar? (Prefiro usar a função boost ::, pois ouvi o sinal ser bastante lento para pequenas coleções de itens.)
Editar Essa é a interface que eu gostaria que o EventManager tivess
class EventManager
{
public:
void addEventHandler(Event::Type evType, Callback func);
void removeEventHandler(Event::Type evType, Callback func);
void queueEvent(boost::shared_ptr<Event> ev);
void dispatchNextEvent();
};