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

标签 c++ pointers c++11

我正在尝试制作一个封装 libcurl 响应的 CurlResponse 对象。我对 curl 选项 WRITEFUNCTIONHEADERFUNCTION 的实现基本相同,唯一的区别是在第一种情况下我调用了 response->appendBody在第二个中 - response->appendHeader。我想要一个函数并将指针传递给适当的方法作为参数,例如WRITEDATA 将是 response->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::binded 函数,但不能将它们传递到任何地方?

最佳答案

问题是您正试图通过 ... 传递一个复杂的对象,正如编译器已经告诉您的那样。可能最好的解决方案是首先将 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;
}

关于c++ - 如何将指针传递给对象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24322322/

相关文章:

c++ - Boost 智能指针和非 POD 类型 (C++)

c - 声明和访问二维数组

c++ - 混合别名和模板特化

c++ - 我怎样才能 std::sqrt(boost::lambda::placeholder1_type)?

c++ - .csv 解析器没有输出

c++ - 是否可以在定义函数的位置之外声明函数的属性? (海湾合作委员会)

c++ - 无法从静态方法调用指向成员函数的指针

c++ - 如何在 Arduino 中将字符串转换为 char *?

C++ 不同类型的指针

c++ - C++ 中内联函数包装器的限制