将函数指针传递到 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' 该实例。