如何将函数变量传递给c ++ lambda函数

时间:2016-12-16 13:17:04

标签: c++ c++11 lambda

我有调用下载管理器功能的主要功能。在该函数内部,我希望能够使用pathUrl函数中的onFileTaskSuccess。我怎么能把它传递进来?

std::string  MyClass::DownloadFromUrl()
{
    std::string pathUrl ="";
    //Then i have downloader which looks like this:
    this->m_downloader->onFileTaskSuccess = [this](const network::DownloadTask& task)
    {
        //i want to use pathUrl here .. how can i pass it to here ?
        pathUrl = someValueFromTheApp;
    }
return pathUrl;
}

修改
我的主要目标是从修复问题的主要功能返回值 这是在内部lambda函数中计算的。 我也尝试过: 这是参考:

this->m_downloader->onFileTaskSuccess = [this,&pathUrl,&someValueFromTheApp](const network::DownloadTask& task)
        {
            //i want to use pathUrl here .. how can i pass it to here ?
            pathUrl = someValueFromTheApp;
        }   

但我得到了这个错误:

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion) 

1 个答案:

答案 0 :(得分:4)

lambda中的

Capture pathUrl

this->m_downloader->onFileTaskSuccess = [this, pathUrl](const network::DownloadTask& task)
{
    // `pathUrl` can now be used.
}

通常,您可以选择按值(即制作副本)或通过引用进行捕获。如果您通过引用捕获,则假设捕获的对象至少与lambda 一样长。

在您的特定情况下,似乎onFileTaskSuccess异步函数,将在DownloadFromUrl范围结束后调用 - 因此pathUrl应该用价值来捕捉。

在C ++ 14中,您可以使用通用lambda捕获来避免不必要的副本:

this->m_downloader->onFileTaskSuccess = [this, pathUrl = std::move(pathUrl)]
    (const network::DownloadTask& task)
    {
        // `pathUrl` can now be used.
    }

(上面的代码假定在将pathUrl分配给lambda后将不会使用onFileTaskSuccess。)