gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:15:47 24 4
gpt4 key购买 nike

我正在尝试与使用这种熟悉模式的 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_handlermy_new_cpp_handler 都在解决同样的问题;他们正在接受某种功能和某种状态。但后者更受欢迎,因为它从用户那里抽象出很多实现细节,并允许简单地传入一个 lambda 对象。

所以 my_new_cpp_handler 应该接受给定的 func 参数,将其转换为函数指针并将其状态传递给 data

我对标准或 std::function 的实现知之甚少,无法确定这是否是一个合理的要求。 foobar 可以存在吗?

换句话说,我想要的是能够将有状态函数传递给 c 回调处理程序,而无需手动实例化我自己的 struct 类型来传递连同它。显然 std::function 已经为我们完成了这个,所以我希望能够以某种方式将函数指针与状态分开并将其传递给 c -样式处理程序。这可能吗?

最佳答案

Is this possible?

没有。

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

此外,任意std::function... (或 lambda)可以包装代码 other 而不是调用 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 对象传递给采用函数指针的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com