2016-06-12 4 views
0

Я играю с boost :: future .then(). Я написал небольшой реактор, который читает файлы асинхронным образом. Существует функция readFileAsync (int fd), которая возвращает будущее для данных из файла. Этот реактор будет считывать до фиксированного количества байтов, когда дескриптор готов и выполнит обещание. Однако я застрял в решении о перезапуске будущего, если из файла может быть больше данных. Для чего это нужно?Можно ли перезапустить boost :: future?

readFileAsync(fd).then([&](auto future) { 
    auto data = future.get(); 
    if (data.block.empty()) { // end of file 
    close(data.fd); 
    } else { 
    readFileAsync(data.fd).then(...); // XXX: how to work that out? 
    } 
}); 

ответ

1

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

struct continue_reading 
{ 
    template <typename T> 
    void operator()(T future) 
    { 
     auto data = future.get(); 
     if (data.block.empty()) { // end of file 
      close(data.fd); 
     } else { 
      readFileAsync(data.fd).then(continue_reading); 
    } 
}; 

//... 

readFileAsync(fd).then(continue_reading)