在C库上使用std::函数

Working with std::function on C libraries

本文关键字:std 函数      更新时间:2023-10-16

我有一个带有以下签名的C库函数,

void register_callback(void (*callback)(int, void*), void* args);

如果我有一个表单的回调,那么最好的方法是什么

std::function<void(int)>?
std::function<void(int)> bob;
register_callback( [](int x, void* pbob){
  auto& bob = *static_cast<std::function<void(int)>*>(pbob);
  bob(x);
}, &bob );

只要变量CCD_ 1有效。

bob的副本是不够的,我们在register_callback调用中使用指针指向的bob的实际实例必须足够长。

如果这很困难,则考虑使用智能指针包装所述std::function并执行指向存储的std::function的指针。

上面会有适度的开销,因为我们通过函数指针进行调度,然后通过等效的vtable进行调度,再在std::function内部进行调度。

上面所做的是,我创建了一个无状态lambda,将void* args转换为指向-std::function的指针,并用bob1调用该std::function。无状态lambda可以隐式转换为函数指针。

带有:

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);