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

C++ 如何将指针传递给对象方法?,c++,pointers,c++11,C++,Pointers,C++11,我试图创建一个CurlResponse对象来封装libcurl响应。我对curl选项WRITEFUNCTION和HEADERFUNCTION的实现基本相同,唯一的区别是在第一种情况下调用response->appendBody,在第二种情况下调用response->appendHeader。我希望有一个函数,并将指向适当方法的指针作为参数传递,例如,WRITEDATA将是response->appendBody,我可以调用writer(data)。但是,当我执行以下代码时,我得到一个错误: e

我试图创建一个
CurlResponse
对象来封装libcurl响应。我对curl选项
WRITEFUNCTION
HEADERFUNCTION
的实现基本相同,唯一的区别是在第一种情况下调用
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 ‘...’
错误:无法通过“…”传递非普通可复制类型“struct std::_Bind”的对象

#包括
#包括
#包括
#包括
使用名称空间std;
类响应{
公众:
void appendBody(字符串数据){

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

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

CURLOPT\u WRITEDATA
用于指定
CURLOPT\u WRITEFUNCTION
的参数或文件句柄,但您试图传递一个函数,为什么?我试图将数据读入内存,特别是读入表示curl获得的所有数据的一个对象。还有其他方法吗?我尝试像
&writeBody,在
WriteMemoryCallback
中将
writer
更改为
WriteMemoryCallback
中的
writer
,但现在我无法调用它-
“writer”不能用作函数。顺便说一句,Curl api位于
WriteMemoryCallback
中-前3个参数始终相同,第四个由WRITEDATA提供。尚未看到回调代码,sorry、 好的,在这种情况下,您还必须修复参数类型。您将指针传递给绑定对象,而不是函数对象。修复后,您可以使用
(*writer)(数据)调用它
@Bob我根据你的反馈编辑了我的答案。希望这行得通。它似乎行得通,谢谢。但奇怪的是,我可以像
function writeBody=std::bind…
那样叫它,它仍然行得通,而
auto writeBody=std::bind…
则不行。我认为
auto
等于完整的类型定义选项?是的,它是相等的,这就是这里的问题:
auto
计算为一个涉及
std::\u Bind
模板的类型(实现细节;查看完整类型的错误消息)。当您编写
function foo=std::Bind..
时,通过复制(和隐藏)来构造一个新的
function
对象
std::bind
内容,这样我们就有了一个规范化的可调用接口。
    function<void(string)> writeBodyPass(writeBody);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &writeBodyPass);
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;
}