C++ 扣除Lambda函子的参数包参数
我有一个类,我想用它在EventQueue上执行回调:C++ 扣除Lambda函子的参数包参数,c++,templates,lambda,closures,C++,Templates,Lambda,Closures,我有一个类,我想用它在EventQueue上执行回调: 模板 类处理程序; 模板 类处理程序 { 公众: 处理程序(事件::事件队列和均衡器,乐趣):\u均衡器(均衡器),\u乐趣(乐趣) {} void运算符()(Args…Args) { _eq.call(this,&Handler::callInternal,args…); } 私人: events::EventQueue&_eq; 乐趣!; 无效callInternal(Args…Args) { _乐趣(args…); } }; 其中E
模板
类处理程序;
模板
类处理程序
{
公众:
处理程序(事件::事件队列和均衡器,乐趣):\u均衡器(均衡器),\u乐趣(乐趣)
{}
void运算符()(Args…Args)
{
_eq.call(this,&Handler::callInternal,args…);
}
私人:
events::EventQueue&_eq;
乐趣!;
无效callInternal(Args…Args)
{
_乐趣(args…);
}
};
其中EventQueue::call(…)接受对象指针、方法指针和用于调用方法的参数
我真的想用一个右值lamba表达式实例化一个Handler类型的对象,例如
makeHandler([](int-result){…});
我不在乎是否必须使用助手方法,例如makeHandler
来构造处理程序
但这方面的东西对我不起作用:
模板
处理程序makeHandlerInternal(事件::EventQueue&eq、Fun-Fun、void(Fun::*)(参数…)常量)
{
返回处理程序(eq,fun);
}
模板
Handler makeHandler(事件::EventQueue&eq,Fun-Fun)
{
返回处理程序(eq、fun和fun::operator());
}
因为Args。。。在我可以将它定义为Fun::operator()所接受的参数之前,它似乎被推断为一个空列表
另一方面:有没有真正好的资源来加强模板编程技能,以解决类似的问题?您的语法几乎是正确的。我看不到将
Args…
转换为void(Args…
的好理由,并建议以下解决方案:
// This stub is here for the sake of code completeness only
class EventQueue {
public:
template<class T, class Fun, class... Args>
void call(T* obj, Fun fun, Args... args) const {
std::invoke(fun, obj, args...);
}
};
template<class Fun, class... Args>
class Handler {
public:
Handler(EventQueue& eq, Fun fun) : eq_(eq), fun_(fun) {}
void operator()(Args... args) {
eq_.call(this, &Handler::callInternal, args...);
}
private:
EventQueue& eq_;
Fun fun_;
void callInternal(Args... args) {
fun_(args...);
}
};
template<class Fun, class... Args>
auto makeHandlerImpl(EventQueue& eq, Fun fun, void (Fun::*)(Args...) const) {
return Handler<Fun, Args...>(eq, fun);
}
template<class Fun>
auto makeHandler(EventQueue& eq, Fun fun) {
return makeHandlerImpl(eq, fun, &Fun::operator());
}
EventQueue eq;
auto handler = makeHandler(eq, [](int result) { std::cout << result; });
handler(2020); // prints 2020
现在,使用C++17,您可以简单地编写:
EventQueue eq;
Handler handler(eq, [](int result) { std::cout << result; });
handler(2020); // prints 2020
EventQueue-eq;
Handler handler(EQ,[](int结果){ STD::CUT,我认为你的主模板不正确:它应该只是<代码>模板类处理程序;而不是<代码>模板类处理程序;。此外,还没有使用参数,类Foovis/Cuff>。关于模板的好书籍:C++模板:完整指南(D.VANDEOORDE,N.JOUTITY),C++模板元编程(D.AbraHAMS,A.GurtoVoy),高级C++元编程(D.Di Gennaro),现代C++设计(A.Alexandrescu)。这就搞定了。我试图修复汉德勒是无效的原因(ARGS…)这是EventQueue::call将回调发布到队列中,以便稍后调用回调。此时返回值是毫无意义的,因为无处可返回值。但我现在同意您的第二个建议,以使其工作。我可能稍后使用静态断言检查传入模板类型的特征
EventQueue eq;
Handler handler(eq, [](int result) { std::cout << result; });
handler(2020); // prints 2020