我已经创建了简单的基于回调的事件管理器并且它可以工作,但是我有一些模板参数为零的错误。
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
之类的。
关于c++ - 无法推断可变参数模板的模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548870/