透明地配置std::function / lambda回调
Tranparently configure an std::function / lambda callback
我有如下结构:它是一个对所有元素调用回调的容器。fct
可以是lambda、函子或普通函数指针。
现在,在某些情况下,我想在调用fct
之前可选地配置它。例如,fct
在每个x上计算一个复杂的函数,但ContainerX
已经知道一个中间结果——我想告诉fct
这个中间结果。如果fct
是一个函子,它有一个状态,它可以存储中间结果。如果它是一个普通函数,它不能存储中间结果,应该在没有预配置的情况下调用。
class ContainerX{
void callback(function<void(X* x)> fct){
// 1. Tell fct the intermediate result, if it is able to be configured
// 2. Call fct for all x in the container
}
}
基本上有很多方法可以做到这一点:
- 我可以将
fct
定义为function<void(X* x, double result)>
- 我可以将
fct
定义为具有实际功能和预配置功能的抽象类。
但是这些解决方案需要我改变callback
的签名,这样我就不能再用普通函数和函子调用它了。
是否有一种方法可以透明、优化地配置fct
?
我将创建callback
的重载,并使用result
参数。它看起来像这样:
class ContainerX{
void callback(function<void(X* x)> fct){
}
void callback(function<void(X* x, double result)>){
}
}
但是这些解决方案需要我改变回调的签名,这样我就不能再用普通函数和函子调用它了。
本质上有两个不同的回调函数。一种使用中间值获取函数的方法。一个没有。有时你想要不同的签名,但功能大致相同。这就是重载的作用
相关文章:
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 使用带有闭包的 lambda 的回调
- 通过实用程序 fn 将捕获的 lambda 传递给 C 样式回调 - 错误
- C++模板函数中,指定回调函子/lambda 的参数类型,同时仍允许内联?
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- ROS:在nodehandle.subscribe中使用lambda作为回调
- 如何定义与将 Lambda 与捕获作为回调一起使用兼容的函数指针
- lambda回调中Android Cocos2D-X应用程序上的SEG故障
- 在库中的 C++17 中强制内联回调 (lambda)
- 如何使用C lambda将成员功能指针转换为普通功能指针,以用作回调
- std::函数,带有 SDL 事件回调的 lambda 错误
- 将lambda传递到lambda回调参数
- C lambda/回调弹出窗口
- C lambda回调为触发事件
- 允许 lambda/回调函数的多个签名作为模板参数
- 读取 Lambda 回调后的访问冲突
- 如何避免在调用异步函数进行 lambda 回调时出现额外的副本
- C++ VS 2013 中的 11 lambda 回调无法编译
- 不带Y Combinator的递归lambda回调
- 透明地配置std::function / lambda回调