我想知道是否可以将成员函数指针传递给lambda捕获列表?我试过传递它但是无济于事它不起作用:
GetHeadline = RSSCrawler::Extract;
auto headlines = client.request(methods::GET).then([RSSCrawler::*GetHeadline](http_response response)
{
if (response.status_code() == status_codes::OK)
{
auto jsonContent = response.extract_json().get();
auto outcome = GetHeadline(jsonContent);
wcout << jsonContent << endl;
}
});
答案 0 :(得分:2)
我对your other question的回答隐含了这个答案:这不是将变量绑定到成员函数的正确语法。您告诉它捕获指针的类型,这没有任何意义。
按值捕获先前定义的指向成员函数的变量:
[GetHeadline]
或者 - 更好 - 您不需要在捕获列表中声明指针,因为我们可以使用类型推导在捕获中声明新变量:
[GetHeadline = &RssCrawler::Extract]
无论哪种方式,你需要记住我的另一个答案中的一个关键点:你必须提供一个可以调用指向方法的实例,所以改变这个:
auto outcome = GetHeadline(jsonContent);
......对此:
auto outcome = (some_instance.*GetHeadline)(jsonContent);
当然,这意味着您也必须捕获或传入实例。所有这些方法和实例指针飞来飞去,这一切都变得有点复杂吗?好吧,幸运的是,如果你处在正确的情况下,那就更好了!哪个是......
但是,如果你在非static
成员函数中定义lambda,你可以简单地告诉它捕获调用所述成员函数的实例,通过捕获this
。这样做允许lambda调用/访问类中的任何内容,就像 那个实例一样:
auto headlines = client.request(methods::GET).then(
[this](http_response response) // capture this instance
{
if (response.status_code() == status_codes::OK)
{
auto jsonContent = response.extract_json().get();
auto outcome = Extract(jsonContent); // this->Extract
wcout << jsonContent << endl;
}
}
);
因此,每次运行此成员函数时,调用它的实例都会在新的lambda中捕获,该lambda可以代表&#39;那个例子。