Сопрограммы — это один из полезных приемов программирования.
Например, в C# сопрограммы могут быть использованы для создания итераторов (см. ключевое слово yield) (но не более — область их применения ограничена итераторами).
Для C и C++ существует интересный способ добавить такую возможность в язык — с помощью макросов.
Собственно, весь код взят со страницы http://www.codepost.org/view/104 и содержит всего совсем немного строчек.
Вот он:
#define cr_context int __s;
#define cr_init() __s = 0;
#define cr_start() switch (__s) { case 0:
#define cr_return(x) { __s = __LINE__; return x; case __LINE__: ; }
#define cr_end() { break; default: for (;;) ; } } __s = 0;
И пример его использования:
class foobar_f {
private:
cr_context;
// place the variables which need to be remembered between calls here.
int i;
public:
foobar_f(void) {
cr_init();
}
// overloading the function application operator "()"
int operator () (void) {
cr_start();
for (i = 0; i < 1337; i++) {
cr_return(i);
}
cr_end();
}
};
// create a function object, sometimes (incorrectly) called functor.
foobar_f foobar;
printf("%d\n", foobar()); // prints 0
printf("%d\n", foobar()); // prints 1
printf("%d\n", foobar()); // prints 2
Возможно, будет полезно...