将函数指针传递给lambda捕获列表

时间:2016-07-16 10:48:29

标签: c++ lambda function-pointers

我想知道是否可以将成员函数指针传递给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;
    }

});

1 个答案:

答案 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;那个例子。