в

Kazan Dev Alliance

Казанское Сообщество Разработчиков Программного Обеспечения

Персональный блог Дмитрия Кальянова

December 2006 - Posts

  • Сопрограммы на C и C++

    Сопрограммы — это один из полезных приемов программирования.

    Например, в 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 
    

    Возможно, будет полезно...

© 2007 Kazan Developers Community and Post`s Authors