【发布时间】:2011-07-30 15:14:51
【问题描述】:
我正在尝试为我的游戏编写一个事件系统。我的事件管理器将存储的回调既可以是普通函数,也可以是仿函数。我还需要能够比较函数/函子,以便知道我需要从事件管理器断开哪一个。
• 最初我尝试使用 boost::function;它可以很好地处理函数和仿函数,只是它没有 operator==,所以如果我愿意,我不能删除回调。
class EventManager
{
typedef boost::function<void (boost::weak_ptr<Event>)> Callback;
std::map<Event::Type, std::vector<Callback>> eventHandlerMap_;
};
• 我也尝试过使用 boost::signal,但这也给了我一个与 operator==: 相关的编译问题
二进制 '==' : 未找到接受“const Functor”类型左侧操作数的运算符(或没有可接受的转换)
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:: 函数或 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 信号示例中的那个来自boost::function_equal。
标签: c++ event-handling boost-bind