c++ - 绑定(bind)静态成员函数作为回调

标签 c++ c++11 bind

我正在尝试使用 std::bind 将成员函数用作 termios.h header 中 sigaction 的回调。我了解成员函数需要特别注意,并且已阅读并遵循示例 herehere ,但没有这样的运气。

因为我可以传递静态函数,所以我想如果我将函数保留为静态,添加第二个变量作为指向自身的指针(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;

错误看起来非常相似,看起来它不能隐式地将绑定(bind)转换为它需要的处理程序,但是当我从输入类型和返回类型的角度来看它时,它应该可以工作。我错过了什么?

最佳答案

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;

另请注意,根据信号的性质,信号处理程序中允许的操作范围可能非常有限。

关于c++ - 绑定(bind)静态成员函数作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47391717/

相关文章:

javascript - 使用 "bind"创建时保留函数属性

jQuery 取消绑定(bind)然后绑定(bind)

dns - 如何远程管理 DNS 服务器?

c++ - Qt在特定代码后没有继续运行指令

c++ - 在 nullptr 上使用重载/替换的 delete[]

c++ - 如何将 char 数组插入到 float vector 中

c++ - 有没有办法使 unique_ptr 的实例化不那么冗长?

c++ - SFINAE 不适用于 constexpr 函数?

c++ - 如何从模板类的可变包中的每个类型中恢复非类型名模板参数?

c++ - 运行昂贵初始化的最佳方法是什么?