如何将 std::function 对象传递给采用函数指针的函数?

2024-01-01

我正在尝试与用以下语言编写的库进行交互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);
}

Both some_c_handler and my_new_cpp_handler正在解决同样的问题;他们正在接受某种功能以及某种状态。但后者是首选,因为它从用户那里抽象了许多实现细节,并且允许简单地传入 lambda 对象。

So my_new_cpp_handler应采取func给定参数,将其转换为函数指针并将其状态传递给data.

我对标准或实施了解不够std::function知道这是否是一个合理的要求。能foo and bar exist?

换句话说,我想要的是能够将有状态函数传递给c回调处理程序,无需手动实例化我自己的struct键入以传递它。明显地std::function已经为我们做到了这一点,所以我希望能够以某种方式将函数指针与状态分开并将其传递给c-风格的处理程序。这可能吗?


这可能吗?

No.

您可以将 C 风格的回调包装成std::function<>...,编译器将发出代码来提取datahandler并调用它。然而,执行此操作的确切代码将取决于编译器、ABI以及正在使用的标准 C++ 库。仅给出以下内容,您无法神奇地重建该代码std::function包装纸。

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

P.S.

换句话说,我想要的是能够将有状态函数传递给 c 回调处理程序,而不必手动实例化我自己的结构类型来传递它。明显地std::function已经为我们做到了这一点

So why don't你只需使用什么std::function已经为你做了:

void my_new_cpp_handler(std::function<void()>&& func)
{
  func();  // calls some_c_handler(p, data) IFF that is what "func" encodes.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 std::function 对象传递给采用函数指针的函数? 的相关文章

随机推荐