Могу ли я использовать libcurls CURLOPT_WRITEFUNCTION с лямбда-выражением C ++ 11? - PullRequest
9 голосов
/ 08 июля 2011

Я пытался использовать лямбда-выражение C ++ 11 с CURLOPT_WRITEFUNCTION, но программа вылетает во время выполнения с нарушением прав доступа. Я не уверен, как смотреть дальше в этом из-за недостатка знаний C ++ 11, но, возможно, у кого-то есть идея, как заставить это работать.

Функция:

#ifndef CURL_GET_H
#define CURL_GET_H

#include <curl/curl.h>
#include <curl/easy.h>
#include <vector>
#include <string>

std::vector<std::string> curl_get(const char* url)
{
    CURL *curl;
    CURLcode res;

    std::vector<std::string> content;
    auto curl_callback = [](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
        // does nothing at the moment due to testing...
        return size * nmemb;
    };

    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/aaa.txt");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return content;
}

#endif // CURL_GET_H

Ошибка:

Unbehandelte Ausnahme bei 0x000000cc в lpip_dl.exe: 0xC0000005: Zugriffsverletzung bei Position 0x00000000000000cc.

(нарушение доступа в позиции 0x00000000000000cc)

Случается, когда curl хочет использовать обратный вызов:

wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);

Ответы [ 2 ]

8 голосов
/ 06 февраля 2013

Вы действительно можете сделать это, приведя лямбда-функцию к указателю на функцию.Сначала вы можете сделать typedef, чтобы упростить приведение.

typedef size_t(*CURL_WRITEFUNCTION_PTR)(void*, size_t, size_t, void*);

Затем вы используете static_cast.

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, static_cast<CURL_WRITEFUNCTION_PTR>(curl_callback));

Примечание.захватывает [].

1 голос
/ 02 сентября 2011

libcurl - простая библиотека C, вам нужно установить обратный вызов, который может быть вызван из такого.Это означает, что забавные вещи C ++ должны быть "C'ified", чтобы работать в первую очередь.Как в указателе функции старого стиля.

Это также рассматривается в записи часто задаваемых вопросов libcurl " Использование нестатических функций C ++ для обратных вызовов? "

См. Также Обратные вызовы в стиле C в C ++ 11

...