c – 如何将std :: function对象传递给带函数指针的函数?

我正在尝试使用c语言编写的库,它使用这种熟悉的模式:

void some_c_handler(void(*func)(void*), void* data);

现在,我想为这个函数编写一个C包装器,如下所示:

void my_new_cpp_handler(std::function<void()>&& func)
{
  void (*p)() = foo(func);
  void* data = bar(func);
  some_c_handler(p, data);
}

some_c_handler和my_new_cpp_handler都解决了同样的问题;他们与某个州一起承担某种功能.但后者是首选的,因为它从用户抽象出大部分实现细节,并允许简单地传入lambda对象.

因此my_new_cpp_handler应该获取它给出的func参数,将其转换为函数指针并将其状态传递给数据.

我不太了解标准,或std :: function的实现,知道这是否是一个合理的请求.可以和foo存在吗?

换句话说,我想要的是能够将有状态函数传递给c回调处理程序,而不必手动实例化我自己的结构类型以传递它.显然std :: function已经为我们做了这个,所以我希望能够以某种方式将函数指针与状态分开并将其传递给c风格的处理程序.这可能吗?

最佳答案

Is this possible?

没有.

您可以将C样式的回调包装到std :: function<> …中,编译器将发出代码以提取数据和处理程序并调用它.但是,这样做的确切代码将取决于编译器,ABI和正在使用的标准C库.只有std :: function包装器才能神奇地重建代码.

此外,任意std :: function …(或lambda)可以包装除C调式处理程序之外的代码.很明显,应用“神奇重建”的代码从std :: function的这样一个实例中提取C风格的处理程序……不可能成功.

附:

To put it differently, what I want is to be able to pass a stateful function to a c callback handler without having to manually instantiate my own struct type to pass along with it. Obviously std::function has already done this for us

那你为什么不用std :: function已经为你做了什么:

void my_new_cpp_handler(std::function<void()>&& func)
{
  func();  // calls some_c_handler(p, data) IFF that is what "func" encodes.
}

转载注明原文:c – 如何将std :: function对象传递给带函数指针的函数? - 代码日志