c++ - 将带有参数的回调函数传递给函数

标签 c++ c++11 function-pointers void-pointers

我想调用以下函数并向它传递一个带参数的函数。这样做的目的是它应该使用我指定的参数调用该函数,以便我知道是什么触发了该函数(在这种情况下是 Raspberry Pi 上的 gpio 引脚)。

int wiringPiISR( int pin, int edgeType, void (*function)( void ) );

目前我有:

for ( int i = 0; i < myValues.size(); ++i )
{
    int myValue = myValues[ i ];
    wiringPiISR( myValue, INT_EDGE_RISING, &myCallback( myValue ) );
}

虽然这给了我以下错误:

error: lvalue required as unary ‘&’ operand

我无法真正理解我的理解,myValue 是左值还是不是?

这是我想要的吗?如果是这样怎么办? 函数 wiringPiISR 来自一个名为 wiringPi 的库,我想尽可能避免修改它。

最佳答案

您可以像这样结合 imreal 和 Ryan Haining 的答案。

std::function<void()> cbfunc;

void myCallback()
{
  cbfunc();
}
void myWiringPiISR(int val, int mask, std::function<void()> callback)
{
  cbfunc = callback;
  wiringPiISR(val, mask, &myCallback);
}

...然后使用它...

void myActualCallback(int v)
{
  ... do something...
}

myWiringPiISR(myValue, INT_EDGE_RISING, std::bind(myActualCallback, myValue));

无需修补库,您可以使用所有的绑定(bind)/函数优势。我将让您找到解决线程安全问题的方法...

它是如何工作的?简单地说,'std::bind' 将一个函数及其参数绑定(bind)到一个 std:function 对象中,然后可以从 myCallback 函数中“调用”该对象,该函数充当您传递的回调周围的垫片。我之前给回调函数起了一个令人困惑的名字,但这次编辑有望解决这个问题。

关于c++ - 将带有参数的回调函数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30812340/

相关文章:

C++ 从 std::vector<std::function<...>> 中删除 std::function

C++ std::enable_if 区分 float 和有符号数?

c++ - 默认情况下,如何使函数指针参数无操作?

c++ - 当仿函数不是一个选项时,我如何在 C++ 中编写带有自定义函数调用的模板化 RAII 包装器?

c++ - 如何使用通用函数指针作为模板参数?

c++ - 使用 stringstream,我如何解析这些字符串?

指向 2D vector 的 C++ 双指针给出了超出范围的错误

c++ - 依赖于模板参数的成员函数实现

c++ - NRVO 什么时候开始?需要满足哪些要求?

c++ - 返回填充有局部变量的 vector 安全吗?