c++ - 在类内部处理回调时必须调用非静态成员函数的引用

标签 c++ c c++11 pointers callback

我有 PiGPIO 库提供的以下 API 代码。基本上,它允许您在引脚状态更改时设置回调函数。

通常 API 看起来像这样:

typedef void (*gpio_callback_t)(int, int, uint32_t);
int gpioSetAlertFunc(int, gpio_callback_t)

它可以这样调用:

void callback_func(int pin, int NewLevel, uint32_t CurrentTicks)
{
    // Callback process
}

int main()
{
    // Setting up callback function
    gpioSetAlertFunc(10, callback_func)

    // Do stuff while callback will be called independently  
}

现在上面的代码可以完美运行了!


当我尝试将此代码包装在 C++ 类中时,出现了大问题。 该类应如下所示:

class Pin
{
public:
    Pin()
    {
        gpioSetAlertFunc(10, this->internal_gpio_callback) );
    }

    void internal_callback_func(int pin, int level, uint32_t tick)
    {
        cout << "New level: " << pin << " " << level;
    }
}

问题是不允许引用该函数,因为它不是静态函数。更复杂的事情,我不能只是让回调函数静态化。该回调函数将与其余的类方法及其内部变量进行大量交互。

你知道解决这个问题的方法吗?或者可能是使用指针或其他东西的肮脏黑客?

最佳答案

完整的 C 风格回调将接受 void* 参数来传递任意用户定义的数据。由于这个没有,它是图书馆设计中的一个错误。向库作者提出问题。

要解决此问题,您需要创建一个闭包 作为 C 兼容函数。标准 C 或 C++ 无法做到这一点。不过,有一些库(不符合标准且不可移植)可以解决这个问题。一个这样的库是 GNU libffcall , 另一个是 libffi .两者都允许您创建行为类似于普通 C 函数的闭包。

关于c++ - 在类内部处理回调时必须调用非静态成员函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52550214/

相关文章:

c++ - 列表与引用一起使用,作为成员使用时会更改行为

c - ANSI C : How to convert a float value into a short variable

c++ - gcc 的 boost::variant 链接器错误

c++ - std::thread 创建抛出异常

c++ - 将多个非数字插入 std::unordered_set<double>

c++ - 为什么计数整数不返回 d 的预期值?作为数字?

c++ - cv::detail::MultiBandBlender 照片末尾出现奇怪的白色条纹

c++ - 将 lambda 放入类定义中的简洁方法

c - 让字符超过 C 文件中的某个点

c - pthread_create segfault(缓冲读取器示例)