如何在cpp中的curl_easy_setopt()中使用基于类的成员函数作为回调函数

问题描述 投票:0回答:1

我正在编写一个程序,我在文件“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

  1. 将函数指针作为参数传递给 one.cpp 中的 GET 包装器
  2. 将事件处理程序与 one.cpp 分离,以创建一个重载 () 运算符的基于类的函子。直接在 Second.cpp 中使用它。我没有收到任何错误,但回调不起作用
  3. 在 Second.cpp 中创建了一个广义 lambda 并直接将其传递给curl_easy_setopt。回拨失败

任何人都可以建议任何方法吗?这会有帮助的。

c++ c++11 pointers curl functor
1个回答
0
投票

通常的技巧是这样的:

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
作为用户定义的指针。静态函数恢复对象指针并调用“真实”处理程序,实现为“普通”非静态成员函数。

© www.soinside.com 2019 - 2024. All rights reserved.