Как написать лямбда-функцию с аргументами? С++

Я хочу вызвать метод (для этого примера конструктор std::thread) с лямбда-функцией, передав значение int:

int a=10;

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

Я не знаю, как правильно написать такую ​​функцию, я получаю эту ошибку: C2064: термин не оценивается как функция, принимающая 0 аргументов.


person Dainius Kreivys    schedule 27.08.2014    source источник
comment
Вам нужно будет захватить _a, как вы захватите a.   -  person juanchopanza    schedule 28.08.2014
comment
ну, мне нужно просто «а» внутри этого потока.   -  person Dainius Kreivys    schedule 28.08.2014
comment
это лямбда функция   -  person Stas Jaro    schedule 28.08.2014
comment
Почему у вас есть параметр с именем _a?   -  person juanchopanza    schedule 28.08.2014


Ответы (3)


std::thread принимает вызываемый объект, а также любые аргументы для передачи ему. Если вы не укажете аргументы, std::thread попытается вызвать этот объект без аргументов, отсюда и ошибка.

Если вам нужен параметр:

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

Если вы просто пытаетесь использовать a main, он уже захвачен:

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

Я бы также рекомендовал быть очень осторожным, если вы думаете, что вам нужно отсоединить нить. Если есть какая-то возможность присоединиться к треду, сделайте это.

person chris    schedule 27.08.2014

Вы можете получить доступ к int a одним из двух способов. Либо передайте его в качестве параметра конструктору потока, либо зафиксируйте его в закрытии лямбды:

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();
person Galik    schedule 27.08.2014

Если вы хотите только передать некоторое значение лямбда-функции, посмотрите мой код ниже:

int main()
{
    int a = 10;

    [](int arg)
    {
        cout << "arg = " << arg << endl;
    }
    (a);

    return 0;
}

Если вы хотите создать поток с лямбда-функцией и передать ей некоторые аргументы, см. следующий пример кода:

int main()
{
    int a = 10;

    thread thd([](int arg) { cout << "arg = " << arg << endl; }, a);

    thd.join();

    return 0;
}
person Dakorn    schedule 27.08.2014