gpt4 book ai didi

c++ - std::function.target 返回 null

转载 作者:行者123 更新时间:2023-11-28 06:49:02 27 4
gpt4 key购买 nike

我正在使用 cURL 通过 http 下载文件。 cURL 需要一个回调来处理数据,我在我的类中有一个回调,我正在使用 std::bind 和 std::function 的组合来创建具有正确类型的函数。

size_t NetworkResource::writeFunction(char *ptr,size_t size,size_t nmemb,void *userdata)
{
...
}

void NetworkResource::loadFunction(void)
{
using namespace std::placeholders;
typedef size_t CurlCallback(char*,size_t,size_t,void*);
auto function=std::function<CurlCallback>(std::bind(&NetworkResource::writeFunction,this,_1,_2,_3,_4)).target<CurlCallback*>();
CURL *curl=curl_easy_init();
CURLcode err;

...

err=curl_easy_setopt(curl,CURLOPT_WRITEDATA,nullptr);
if(err!=CURLE_OK) std::cout<<curl_easy_strerror(err)<<std::endl;

err=curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,*function);
if(err!=CURLE_OK) std::cout<<curl_easy_strerror(err)<<std::endl;

...
}

问题是函数为空。根据文档,当返回的类型与函数的目标类型不匹配时会发生这种情况,但据我所知它们是匹配的。

最佳答案

auto function = std::function<CurlCallback>(
std::bind(&NetworkResource::writeFunction,this,
_1,_2,_3,_4)).target<CurlCallback*>();

您正在构建的 std::function 对象将在上述表达式的末尾被销毁,变量 function 将指向无效内存,调用std::function::target按预期工作。在这种情况下,它不会,函数调用返回 nullptr

这是因为std::function 的目标函数类型与CurlCallback 的类型不同。 This example显示了该调用有效的情况和失败的情况。


您的问题可以在完全不使用 std::function 的情况下解决。

根据 curl_easy_setopt 的文档, 当第二个参数是 CURLOPT_WRITEFUNCTION 时,第三个参数应该是指向具有签名的函数的指针

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);

可以通过调用 CURLOPT_WRITEDATA 来设置最后一个参数 userdata .使用它传递指向 NetworkResource 实例的指针(this 指针)。

至于write_callback,创建一个执行您需要的功能的静态成员函数。

class NetworkResource
{
// ...
static size_t writeFunction(char *ptr,size_t size,size_t nmemb,void *userdata);
};

size_t NetworkResource::writeFunction(char *ptr,size_t size,size_t nmemb,void *userdata)
{
// userdata points to the NetworkResource instance
auto res = static_cast<NetworkResource *>(userdata);

// use res and the remaining function arguments to handle the call
}

void NetworkResource::loadFunction(void)
{
CURL *curl=curl_easy_init();
CURLcode err;

...

err=curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,&NetworkResource::writeFunction);
if(err!=CURLE_OK) std::cout<<curl_easy_strerror(err)<<std::endl;

err=curl_easy_setopt(curl,CURLOPT_WRITEDATA,static_cast<void *>(this));
if(err!=CURLE_OK) std::cout<<curl_easy_strerror(err)<<std::endl;

...
}

关于c++ - std::function.target 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com