Здравствуйте, kov_serg, Вы писали:
_>Можно использовать структуру/класс для хранения состояния. Но тут кстати RAII немного мешает поэтому лучше использовать аналог defer. То есть за ресурсы отвечает не исполнитель, а тот кто выдаёт задаиние исполнителю. В таком случае ресурсы можно контролировать (например ограничивать сверху).
_>_>struct Fn1 {
_> int line;
_> int i,j,k;
_> int setup(int sev);
_> int loop();
_> static Fn1* my(void* ctx) { return (Fn1*)ctx; }
_> static int _setup(void *ctx,int sev) { return my(ctx)->setup(sev); }
_> static int _loop(void *ctx) { return my(ctx)->loop(); }
_>};
_>int Fn1::loop() {
_> LOOP_BEGIN(line)
_> for(i=1;i<10;i++) {
_> // ...
_> LOOP_POINT
_> // ...
_> }
_> LOOP_END()
_>}
_>...
_> Fn1 fn1[1];
_> Fn1::_setup(fn1,sev_Init);
_> while( Fn1::_loop(fn1) ) {}
_> Fn1::_setup(fn1,sev_Done);
_>
_>Или если больше нравиться можно использовать виртуальные методы, определив общий интерфейс.
_>_>struct AFn {
_> virtual int setup(int)=0;
_> virtual int loop()=0;
_>};
_>
_>Но с функциями гибкость на порядок выше, особенно при использовании внешних динамических библиотек.
Понял, спасибо. Но у тебя скорее С-шный подход. Всё состояние руками управляется. Такое понятно как сделать, но есть надежда, что можно автоматизировать как-то.