gpt4 book ai didi

c++ - C++11 中的 C 风格回调

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:53 25 4
gpt4 key购买 nike

在一个 C++11 项目中,我使用了一个 C 风格的第三方库(在我的例子中是 curl),它需要 C 风格的回调。

为了实现这一点,我使用了“指针到成员”运算符:

size_t c_callback_wrapper(char *ptr, size_t size, size_t nmemb, void *userdata)
{
MyClass *p = (MyClass*)userdata;
return (p->*&MyClass::actualCallback)(ptr, size, nmemb, userdata);
}


void Myclass::performSomething() {
// register callback function
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, c_callback_wrapper);
// register userdata
curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
...
res = curl_easy_perform(curl);
}

这个解决方案确实有效,但我并不满意。

我真正想做的是在我的注册函数中编写一个 lambda。

优势通常是局部性:我将能够捕获一些局部变量并且不需要编写复杂的“actualCallback”成员例程。

我已经读到,在捕获变量时似乎无法将 Lambda 用作 C 风格的函数。

有什么方法可以使用一些技巧来实现这一目标吗? (例如,使用 lambda 的调用约定,...)

谢谢

最佳答案

无法将捕获上下文变量的 lambda 转换为裸函数指针,因为那样无法携带捕获的状态。您在示例中展示的是处理通过 C 回调调用 C++ 成员函数的问题的正确方法。

如果您觉得这样更有吸引力,您可以将 c_callback_wrapper 替换为捕获较少的 lambda。

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, 
[](char *ptr, size_t size, size_t nmemb, void *userdata) {
// invoke the member function via userdata
auto p = static_cast<MyClass *>(userdata);
return p->actualCallback(ptr, size, nmemb, userdata);
});

请注意,您可能应该去掉 actualCallback() 成员函数的最后一个参数,因为那只是 this 指针,它是非静态成员不需要显式传递函数。

关于c++ - C++11 中的 C 风格回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25513380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com