C++ 扣除Lambda函子的参数包参数

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

我有一个类,我想用它在EventQueue上执行回调:

模板
类处理程序;
模板
类处理程序
{
公众:
处理程序(事件::事件队列和均衡器,乐趣):\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