JavaScript создает замыкание с областью, в которой оно было создано. Например:
function startGreeter( name, iterations, delay ) {
function greeter() {
console.log("greetings, "+name+"! i="+iterations);
if( --iterations )
setTimeout( greeter, delay );
}
setTimeout( greeter, delay );
}
startGreeter("Alex",3,1000);
startGreeter("Beth",2,1500);
JavaScript создает два разных экземпляра замыкания для функции greeter (); один для Алекса и один для Бет. Конечно, мы могли бы создать десятки или сотни таких экземпляров; из массива данных, например.
Я хотел бы сделать то же самое sh в C ++; в частности, чтобы иметь возможность создавать N различных экземпляров одновременного закрытия функции.
void startGreeterTask( AsyncManager& asyncManager, std::string name, int iterations, longtime msDelay )
{
TaskFunction greetingTask = [&]()
{
std::cout << "greetings, task " << name << "! iterations = " << iterations << std::endl;
if( --iterations )
{
asyncManager.setTimeout( greetingTask, msDelay );
}
};
asyncManager.setTimeout( greetingTask, msDelay );
}
int main( int argc, char* argv[] )
{
AsyncManager asyncManager;
startGreeterTask( asyncManager, "Alex", 3, 1000 );
startGreeterTask( asyncManager, "Beth", 2, 1500 );
asyncManager.execute();
}
AsyncManager предоставляет функциональность setTimeout (), и он работает, если я создаю несколько замыканий в области действия main (). Но в startGreetingTask () функция закрытия приветствия приветствия не работает так же, как функция greeter () в JavaScript. Насколько я понимаю, welcomeTask () и все упоминаемые параметры выпадают из области видимости, когда startGreeterTask () завершает выполнение, поэтому память стека освобождается. Вызов startGreeterTask () во второй раз создает конфликтующее использование стековой памяти, и ошибка сегмента гарантирует.
Как можно заставить startGreeterTask () работать как функция startGreeter ()?