我有一个带有以下签名的C库函数,
void register_callback(void (*callback)(int, void*), void* args);
如果我有一个表单回调,
,最好的方法是使用它std::function<void(int)>?
答案 0 :(得分:2)
std::function<void(int)> bob;
register_callback( [](int x, void* pbob){
auto& bob = *static_cast<std::function<void(int)>*>(pbob);
bob(x);
}, &bob );
只要变量bob
有效,这仍然有效。
bob
的副本是不够的,我们在bob
调用中指向的register_callback
的实际实例必须足够长。
如果这很困难,请考虑一个智能指针包装所述std::function
并执行指向存储的std::function
的指针。
上面会有适度的开销,因为我们通过一个函数指针调度,然后在vtable的等价物上调度,然后再调整std::function
内部。
上面的内容是我创建了一个无状态lambda,将void* args
转换为指向std::function
的指针,并使用std::function
调用int
。无状态lambdas可以隐式转换为函数指针。
答案 1 :(得分:1)
使用:
class CallBack
{
public:
explicit CallBack(std::function<void(int)> f) : f(f) {}
static void to_c_api(int a, void* that)
{
reinterpret_cast<CallBack*>(that)->f(a);
}
private:
std::function<void(int)> f;
};
然后你可以做
CallBack callback; // should live longer than the calls
void register_callback(CallBack::to_c_api, &callback);