将函数指针传递到 lambda 捕获列表
Passing function pointer into lambda capture list
我想知道是否可以将成员函数指针传递到 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;
}
});
这个问题的答案隐含在我对 的回答中:这不是将 变量 绑定到成员函数的正确语法。您告诉它捕获指针的 type ,这是没有意义的。
按值捕获先前定义的指向成员函数的指针变量:
[GetHeadline]
或者 - 更好 - 您不需要在捕获列表之外声明指针,因为我们可以使用类型推导在捕获中声明新变量:
[GetHeadline = &RssCrawler::Extract]
无论哪种方式,你都需要记住我的另一个答案中的一个关键点:你必须提供一个实例来调用 指向的方法,所以改变这个:
auto outcome = GetHeadline(jsonContent);
...为此:
auto outcome = (some_instance.*GetHeadline)(jsonContent);
当然,这意味着您还必须捕获或传入该 实例。所有这些方法和实例指针飞来飞去,这一切不会变得有点复杂吗?好吧,谢天谢地,如果你处在正确的情况下,还有更好的方法!这是...
但是,如果你在非static
成员函数中定义lambda,你可以简单地告诉它捕获所述成员函数所在的实例通过 捕获 this
调用。这样做允许 lambda call/access class 中的任何东西,就好像它 是 那个实例:
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 可以作用于 'on behalf of' 该实例。
我想知道是否可以将成员函数指针传递到 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;
}
});
这个问题的答案隐含在我对
按值捕获先前定义的指向成员函数的指针变量:
[GetHeadline]
或者 - 更好 - 您不需要在捕获列表之外声明指针,因为我们可以使用类型推导在捕获中声明新变量:
[GetHeadline = &RssCrawler::Extract]
无论哪种方式,你都需要记住我的另一个答案中的一个关键点:你必须提供一个实例来调用 指向的方法,所以改变这个:
auto outcome = GetHeadline(jsonContent);
...为此:
auto outcome = (some_instance.*GetHeadline)(jsonContent);
当然,这意味着您还必须捕获或传入该 实例。所有这些方法和实例指针飞来飞去,这一切不会变得有点复杂吗?好吧,谢天谢地,如果你处在正确的情况下,还有更好的方法!这是...
但是,如果你在非static
成员函数中定义lambda,你可以简单地告诉它捕获所述成员函数所在的实例通过 捕获 this
调用。这样做允许 lambda call/access class 中的任何东西,就好像它 是 那个实例:
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 可以作用于 'on behalf of' 该实例。