我正在嘗試爲我的遊戲編寫一個事件系統。我的活動經理將存儲的回調既可以是普通函數,也可以是函子。我還需要能夠比較函數/函數,所以我知道我需要從事件管理器斷開哪一個。消息系統:回調可以是任何東西
•最初我嘗試使用boost :: function;它完美地處理函數和函子,除了它沒有運算符==,所以我不能刪除回調,如果我想。
class EventManager
{
typedef boost::function<void (boost::weak_ptr<Event>)> Callback;
std::map<Event::Type, std::vector<Callback>> eventHandlerMap_;
};
•我也使用boost ::信號試過了,但也給了我與運營商==編譯問題:
二進制「==」:沒有操作員發現這需要一個左類型「常量函子」的 - 手操作數(或沒有可接受的轉換)
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
}
關於我如何實現這個沒有其他的建議?或者,也許我可以如何使boost :: function或boost :: signal工作? (我寧願使用boost ::功能雖然,因爲我聽說過的信號,而對項目的小集合放緩。)
編輯:這是我想eventmanager進行的,該界面具有。
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();
};
@bdonlan所述一個在所述信號的例子是從[升壓:: function_equal](http://www.boost.org/doc/libs/1_47_0/doc/html/boost/function_equal.html)。 –
八九不離十DUP:http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects – stijn