我已经创建了基于回调的简单事件管理器,并且可以使用,但是模板参数为零时出现一些错误。
class event_manager
{
public:
template <typename... T>
static void register_event(const unsigned long e, std::function<void(T...)> ec)
{
events.insert({ e, ec });
}
template <typename... T>
static void fire_event(const unsigned long e, T... args)
{
for (auto it : events)
{
if (it.first == e)
{
boost::any_cast<std::function<void(T...)>>(it.second)(args...);
}
}
}
private:
static std::unordered_multimap<unsigned int, boost::any> events;
};
我正在使用以下代码添加回调:
event_manager::register_event<unsigned int>(DVU_EVENT_KEY_PRESSED, [](unsigned int key)
{
//Works!
});
event_manager::register_event(DVU_EVENT_IDLE, []()
{
//Could not deduce template argument
});
第二个问题:是否可以更改代码以删除<unsigned int>
类似模板的规范?
例子:
event_manager::register_event(DVU_EVENT_KEY_PRESSED, [](unsigned int key){}));
由于lambda只是的函子operator()
,您可能会有一个重载,最终得出它:
template <typename F>
static void register_event(const unsigned long e, F f)
{
register_event(e, f, &F::operator());
}
template <typename F, typename R, typename... T>
static void register_event(const unsigned long e, F& f,
R (F::*method)(T...) const)
{
std::function<R(T...)> func = f;
events.insert({ e, func });
}
也许需要那个R == void
或者static_assert
它或者其他的东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句