如何编写带参数的lambda函数?c++



我想调用一个方法(对于本例,std::thread构造函数)带lambda函数,传递int值:

int a=10;
std::thread _testThread = thread([a](int _a){
  //do stuff using a or _a ?
});
_testThread.detach();

我不知道如何正确地编写这样的函数,我得到了以下错误:C2064:术语不计算为具有0个参数的函数

std::thread接受一个可调用的对象以及要传递给它的任何参数。如果不提供参数,std::thread将尝试在没有参数的情况下调用该对象,因此会出现错误。

如果你需要一个参数:

std::thread _testThread{[a](int _a) {
    std::cout << a << ' ' << _a; //prints main's a, followed by somethingThatWillBe_a
}, somethingThatWillBe_a};

如果你只是想使用maina,它已经被捕获了:

std::thread _testThread{[a] {
    std::cout << a; //prints main's a
}};

如果您认为需要分离线程,我也建议您格外小心。如果有任何可能加入线程,那就去吧。

您可以通过以下两种方式之一访问int a。要么将其作为参数传递给线程的构造函数,要么在lambda的闭包中捕获它:

int a=10;
// pass in a as a parameter
std::thread _testThread1([](int _a){
  //do stuff using a or _a ?
}, a); // pass a to the parameter _a
_testThread1.detach();
// capture a in the closure
std::thread _testThread2([a](){ // capture a
  //do stuff using a or _a ?
});
_testThread2.detach();

如果您只想向lambda函数传递一些值,请查看下面的代码:

int main()
{
    int a = 10;
    [](int arg)
    {
        cout << "arg = " << arg << endl;
    }
    (a);
    return 0;
}

若您想用lambda函数创建线程并向其传递一些参数,请参阅下一个代码示例:

int main()
{
    int a = 10;
    thread thd([](int arg) { cout << "arg = " << arg << endl; }, a);
    thd.join();
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新