【发布时间】:2016-09-18 20:35:25
【问题描述】:
我正在尝试与使用这种熟悉模式的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 参数,将其转换为函数指针并将其状态传递给data。
我对标准或std::function 的实施知之甚少,不知道这是否是一个合理的要求。 foo和bar可以存在吗?
换句话说,我想要的是能够将有状态函数传递给c 回调处理程序,而不必手动实例化我自己的struct 类型来传递它。显然std::function 已经为我们完成了这项工作,所以我希望能够以某种方式将函数指针与状态分开并将其传递给c 样式的处理程序。这可能吗?
【问题讨论】: