【发布时间】:2020-11-18 21:31:19
【问题描述】:
我有一个类,我想用它在 EventQueue 上执行回调:
template <class, class>
class Handler;
template <class Fun, class... Args>
class Handler<void(Args...)>
{
public:
Handler(events::EventQueue &eq, Fun fun) : _eq(eq), _fun(fun)
{}
void operator()(Args... args)
{
_eq.call(this, &Handler::callInternal, args...);
}
private:
events::EventQueue &_eq;
Fun _fun;
void callInternal(Args... args)
{
_fun(args...);
}
};
其中 EventQueue::call(...) 接受一个对象指针、一个方法指针和用于调用该方法的参数。
我真的很想用右值兰巴表达式实例化一个 Handler 类型的对象,例如
makeHandler([](int result) { ... });
我不在乎是否必须使用辅助方法,例如makeHandler 来构造Handler。
但是这些方面的东西对我不起作用:
template <class Fun, class... Args>
Handler<Fun, void(Args...)> makeHandlerInternal(events::EventQueue &eq, Fun fun, void (Fun::*)(Args...) const)
{
return Handler<Fun, void(Args...)>(eq, fun);
}
template <class Fun, class... Args>
Handler<Fun, void(Args...)> makeHandler(events::EventQueue &eq, Fun fun)
{
return Handler<Fun, void(Args...)>(eq, fun, &Fun::operator());
}
因为 Args... 似乎在我可以将其定义为 Fun::operator() 采用的参数之前被推断为一个空列表。
附带说明:是否有一个非常好的资源来加强模板编程技能以解决此类问题?
【问题讨论】:
-
我认为您的主模板不正确:它应该只是
template <class> class Handler;而不是template <class, class> class Handler;。 -
特化还有一个未使用的参数
class Fun。 -
关于模板的好书:C++ 模板:完整指南(D.Vandevoorde,N.Josuttis),C++ 模板元编程(D.Abrahams , A.Gurtovoy),高级 C++ 元编程 (D.Di Gennaro),现代 C++ 设计 (A.Alexandrescu)。
标签: c++ templates lambda closures