我有一个C ++函数,可以从libcurl api进行调用。签名如下:
size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback);
我的实施目前正是如此。
extern "C" {
size_t my_callback(char *contents, size_t size, size_t nmemb, void *userp)
{
// ...
data1 = getdata();
data2 = getdata();
return count;
}
}
int MyClass::funcA()
{
// ...
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_callback);
// ...
}
如何进行此回调,以便回调中的dataN变量可以访问我的C ++类的这个实例?
更新:
使用建议的解决方案,我无法将这些函数中的变量复制为类变量。我现在看起来像这样...
class MyClass
{
private:
std::string content_;
static size_t handle(char * data, size_t size, size_t nmemb, void * p);
size_t handle_impl(char * data, size_t size, size_t nmemb);
};
size_t Filter::handle(char * data, size_t size, size_t nmemb, void * p)
{
return static_cast<Filter*>(p)->handle_impl(data, size, nmemb);
}
size_t Filter::handle_impl(char* data, size_t size, size_t nmemb)
{
// stops here
content_.append(data, size * nmemb);
return size * nmemb;
}
// within the main()
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Filter::handle);
问题是我现在无法通过“content_.append”行。但是如果我改变要在此函数中本地声明的内容而不是作为类变量,它将继续。好像我没有看到类实例。