Лямбда, которая захватывает переменные контекста, не может быть преобразована в указатель на голой функции, поскольку это может привести к невозможности переноса захваченного состояния. То, что вы показали в примере, - это правильный способ решить проблему вызова функций-членов C ++ с помощью обратного вызова C.
Вы можете заменить c_callback_wrapper
на захват меньше лямбда, если вы обнаружите, что более привлекательным.
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
, который не нужно передавать нестатической функции-члена явно.