我正在编写一个程序,我在文件“one.cpp”中将事件处理函数定义为类成员函数。我的自定义 http 客户端在其他文件“second.cpp”中定义。
最初我在 one.cpp 中编写了curl逻辑
curl_easy_setopt( m_curl, CURLOPT_WRITEFUNCTION, EventHandler );
curl_easy_setopt( m_curl, CURLOPT_WRITEDATA, (void*) &eventHandlerInfo );
这里EventHandler是处理事件的函数。 EventHandlerInfo 是一个结构体
size_t EventHandler( void* ptr,
size_t size,
size_t nmemb,
EventHandlerInfo* eventHandlerInfo )
这段代码可以工作,但后来我们决定将 one.cpp 从 c 风格转换为基于类 impl 以及来自 secondary.cpp 的curl 的集成。 (在one.cpp中使用second.h)
最后,我们现在有了one.cpp,它有成员函数EventHandler和secrond.cpp,有Get 带有curl 逻辑的请求包装器。需要在 one.cpp 中调用该包装器
我尝试了3种方法,但没有一个有效。llllll
任何人都可以建议任何方法吗?这会有帮助的。
通常的技巧是这样的:
class CurlWrapper {
size_t WriteHandler(char *ptr, size_t size, size_t nmemb);
static size_t WriteHandlerTrampoline(
char *ptr, size_t size, size_t nmemb, void *userdata) {
auto self = static_cast<CurlWrapper*>(userdata);
return self->WriteHandler(ptr, size, nmemb);
}
};
curl_easy_setopt( m_curl, CURLOPT_WRITEFUNCTION, WriteHandlerTrampoline);
curl_easy_setopt( m_curl, CURLOPT_WRITEDATA, this);
也就是说,您注册一个静态成员函数并传递
this
作为用户定义的指针。静态函数恢复对象指针并调用“真实”处理程序,实现为“普通”非静态成员函数。