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

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

int a=10;

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

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

1

Решение

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

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

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

Если вы просто пытаетесь использовать main«s aЗахвачено:

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

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

7

Другие решения

Вы можете получить доступ 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();
2

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

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;
}
1
По вопросам рекламы [email protected]