在C库上使用std::函数
Working with std::function on C libraries
我有一个带有以下签名的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
的指针,并用bob
1调用该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);
相关文章:
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数