在C库上使用std :: function

时间:2015-11-04 19:33:03

标签: c++ c function c++11 callback

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

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

如果我有一个表单回调,

,最好的方法是使用它
std::function<void(int)>?

2 个答案:

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