将静态成员函数绑定为回调
Binding static member function as callback
我正在尝试使用 std::bind
将成员函数用作 termios.h
标头中sigaction
的回调。 我理解对成员功能的特殊照顾需求,并且已经阅读并遵循了这里和这里的示例,但没有这样的运气。
因为我可以通过一个静态函数传递,所以我想如果我让函数保持静态,添加第二个变量作为指向自身的指针(this
(,我会很好,但没有这样的运气:
// In SerialListener.h
static void callback(int status, SerialListener *ptr);
// In the serial listener constructor
// Set callback
auto cb = std::bind(&SerialListener::callback, std::placeholders::_1, this);
sigAct_.sa_handler = cb;
但错误如下:
error: cannot convert ‘std::_Bind<void (*std::_Placeholder<1>, SerialListener*))(int, SerialListener*)>’ to ‘__sighandler_t {aka void (*)(int)}’ in assignment sigAct_.sa_handler = cb;
我还尝试了第二个示例中的变体,没有静态实现:
// In SerialListener.h
void callback(int status);
// In the serial listener constructor
// Set callback
auto cb = std::bind(&SerialListener::callback, this, std::placeholders::_1);
sigAct_.sa_handler = cb;
这会产生...
error: cannot convert ‘std::_Bind<std::_Mem_fn<void (SerialListener::*)(int)>(SerialListener*, std::_Placeholder<1>)>’ to ‘__sighandler_t {aka void (*)(int)}’ in assignment sigAct_.sa_handler = cb;
错误看起来非常相似,看起来它不能隐式地将绑定转换为它需要的处理程序,但是当我从输入类型和返回类型的角度来看它时,它应该可以工作。 我错过了什么?
lambda 或 bind
都无法帮助您将不匹配信号处理程序签名的函数设置为信号处理程序。请注意,信号处理程序函数签名不提供任何通过不透明指针传递类实例的方法。你能做的最好的事情就是在某个静态变量上存储一个指向处理上下文对象的指针:
SerialListener * p_listener;
void On_Signal(int signal_code)
{
if(p_listener)
{
p_listener->DealWith(signal_code); // calling member function
}
}
p_listener= &my_listener;
sigAct_.sa_handler = &On_Signal;
另请注意,根据信号的性质,信号处理程序中允许的操作范围可能非常有限。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 架构决策:返回std::future还是提供回调
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- ROS 订阅回调 - 使用 boost::绑定成员函数
- 将非静态函数绑定到回调时出现问题
- C++绑定回调到类
- 我应该始终使用"T&&"而不是"const T&"或"T&"来绑定到回调函数吗?
- 将静态成员函数绑定为回调
- boost ::绑定发送变量的回调args到回调函数
- ROS:将回调函数和对象成员绑定到订阅节点
- boost::使用成员函数绑定回调的帮助
- 将回调绑定到到期的共享_ptr
- C++ 11 - 将 C 样式回调绑定到类成员函数
- 是否可以将 bind() *this 绑定到类成员函数以回调 C API
- 当通知程序/信号超出范围时,在提升绑定中解除分配回调侦听器对象
- 用API模拟“std::shared_ptr”的智能指针,将回调绑定到refcount-modifying事件,例如re
- 在构造函数中绑定到类中的回调方法
- Boost绑定回调函数指针作为参数