如何将指针传递给对象方法?

时间:2014-06-20 07:43:04

标签: c++ pointers c++11

我试图制作一个封装libcurl响应的CurlResponse对象。我对curl选项WRITEFUNCTIONHEADERFUNCTION的实现大致相同,唯一的区别在于,第一种情况是我调用response->appendBody而第二种情况是response->appendHeader 。我想有一个函数并将指针传递给适当的方法作为参数,例如WRITEDATAresponse->appendBody,我可以致电writer(data)。但是当我执行下面的代码时,我收到一个错误:

 error: cannot pass objects of non-trivially-copyable type ‘struct std::_Bind<std::_Mem_fn<void (CurlResponse::*)(std::basic_string<char>)>(CurlResponse*, std::_Placeholder<1>)>’ through ‘...’

...

#include <iostream>
#include <string>
#include <functional>

#include <curl/curl.h>

using namespace std;

class CurlResponse {
    public:
        void appendBody(string data) {
            cout << "Append body " << data << endl;
        }

        void appendHeader(string data) {
            cout << "Append header " << data << endl;
        }
};

//size_t WriteMemoryCallback(char * contents, size_t size, size_t nmemb, CurlResponse* response)
size_t WriteMemoryCallback(char * contents, size_t size, size_t nmemb, function<void(string)> writer)
{
  size_t realsize = size * nmemb;
  string data(contents, realsize);
//  response->appendBody(data);
  writer(data);
  return realsize;
}

size_t WriteHeaderCallback(char * contents, size_t size, size_t nmemb, CurlResponse* response)
{
  size_t realsize = size * nmemb;
  string data(contents, realsize);
  response->appendHeader(data);
  return realsize;
}

int main() {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if (! curl) return 1;

    curl_easy_setopt(curl, CURLOPT_URL, "http://localhost");

    CurlResponse* response = new CurlResponse();

    auto writeBody = std::bind(&CurlResponse::appendBody, response, placeholders::_1);
    writeBody("Test writing to body");

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, writeBody);
//  curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);

    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, response);

    res = curl_easy_perform(curl);

    if(res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    }

    curl_easy_cleanup(curl);

    return 0;
}

我该如何解决这个问题?这是否意味着我可以在同一个函数中使用std::bind ed函数,但无法将它们传递到任何地方?

1 个答案:

答案 0 :(得分:1)

问题在于您正在尝试通过...传递复杂对象,正如编译器已经告诉您的那样。可能最好的解决方案是首先将std::bind包装在std::function对象中,以避免重复完整类型:

    function<void(string)> writeBodyPass(writeBody);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writeBodyPass);

然后您必须修复回调的签名(和正文),因为您现在正在接收指向std::function对象的指针:

size_t WriteMemoryCallback(char * contents, size_t size, size_t nmemb, function<void(string)> *writer)
{
  size_t realsize = size * nmemb;
  string data(contents, realsize);
  (*writer)(data);
  return realsize;
}