C++可变模板实现EventEmitter时parameter packs未展开报错如何修复
问题原因
编译报错的核心原因是可变参数包没有在std::function的模板参数中正确展开。你定义的多参数版本emit函数里,Args是可变参数类型包,需要在指定std::function签名的时候加...完成展开,否则编译器无法识别这是一组参数类型。
修复方案
只需要修改多参数emit函数里的std::any_cast目标类型即可:
// 修改前(错误) return std::any_cast<std::function<R(Args)>>(eventCallback)(std::forward<Args>(args)...); // 修改后(正确) return std::any_cast<std::function<R(Args...)>>(eventCallback)(std::forward<Args>(args)...);
多参数回调测试
修改完成后,你注释的fun3相关代码可以正常启用,注意调用emit的时候要把所有参数的类型都传入模板参数列表:
e.on("fun3", std::function<double(int, int)>(fun3)); e.emit<double, int, int>("fun3", 1, 2);
修改后所有功能都可以正常运行,支持任意数量参数的回调注册和触发。
内容的提问来源于stack exchange,提问作者0xAnakin
相关产品推荐
相关产品推荐

