Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Adaptable closures

Boost , ,

Adaptable closures

Структура не будет полной без какой-либо поддержки закрытия. Закрытия инкапсулируют рамку стека, где локальные переменные создаются при входе в функцию и разрушаются при выходе. Закрытие обеспечивает среду для проживания локальных переменных. Закрытие может удерживать разнородные типы.

Закрытие Phoenix - это настоящий аппаратный стек. Закрытие обеспечивает истинное возвращение в функции лямбды. Закрытие обеспечивает доступ к кадру стека функций, где находятся локальные переменные. Смоделированные после рамок вложенных стеков Pascal, затворы могут быть вложены так же, как вложенные функции, где код во внутренних затворах может получить доступ к локальным переменным из внешних затворов в масштабе (доступ к внутренним областям из внешних областей является ошибкой и вызовет сбой утверждения времени выполнения).

Spirit Closures

Spirit uses Phoenix closures to allow parameter passing (inherited and synthetic attributes, in parsing parlance) upstream and downstream in a parse traversal (see Spirit documentation).

Существует три (3) взаимодействующих класса:

1 закрытие:<1

В точке декларирования закрытие еще не создает рамки стека и не инстанцирует какие-либо переменные. В декларации о закрытии указываются типы и названия местных переменных. Класс закрытия должен быть подклассирован. Ответственность за закрытие подкласса заключается в предоставлении имен для каждой локальной переменной в закрытие. Пример:

    struct my_closure : closure<int, string, double> {
        member1 num;        // names the 1st (int) local variable
        member2 message;    // names the 2nd (string) local variable
        member3 real;       // names the 3rd (double) local variable
    };
    my_closure clos;

Теперь, когда у нас есть «закрытие», к его локальным переменным можно лениво получить доступ, используя обозначение точки. Каждая квалифицированная локальная переменная может быть использована так же, как и любой примитивный актор. Примеры:

    clos.num = 30
    clos.message = arg1
    clos.real = clos.num * 1e6

Приведенные выше примеры лениво оцениваются. Как обычно, эти выражения возвращают составные акторы, которые будут оцениваться через вызов второй функции (см. операторы). Каждый из участников (clos.xxx) является актером. Таким образом, применение оператора () покажет его личность:

    clos.num() // will return the current value of clos.num
Acknowledgement:

Juan Carlos Arevalo-Baeza (JCAB) introduced and initilally implemented the closure member names that uses the dot notation and Martin Wille who improved multi thread safety using Boost Threads.

2 close_member

Названные локальные переменные закрытия «закрыть» выше фактически являются членами закрытия. Класс Close_member является действующим лицом и соответствует его концептуальному интерфейсу. Member1..memberN - это предварительно определенные типдефы, которые соответствуют каждому из перечисленных типов в параметрах шаблона закрытия.

3 close_frame

Когда закрывающий элемент наконец оценивается, он должен ссылаться на фактический экземпляр переменной в аппаратном стеке. Без этого процесс не будет завершен, и оцениваемый участник приведет к провалу утверждения. Помните, что закрытие – это просто декларация. Местные переменные, к которым относится закрытие, все еще должны быть инстанцированы.

Класс close_frame выполняет фактическую инстантацию локальных переменных и связывает эти переменные с закрытием и всеми его членами. Может быть несколько экземпляров рамок закрытия, обычно расположенных в стеке внутри функции. Каждый экземпляр close_frame инициирует кадр стека с новым набором локальных переменных закрытия. Пример:

    void foo()
    {
        closure_frame<my_closure> frame(clos);
        /* do something */
    }

где «закрытие» является примером нашего закрытия «my_closure» выше. Обратите внимание, что использование выше исключает локально объявленные классы. Если my_closure является локально объявленным типом, мы все равно можем использовать его self_type в качестве параматера для закрытия_frame:

    closure_frame<my_closure::self_type> frame(clos);

После инстанциации, файл close_frame связывает локальные переменные с замыканием. Предыдущая ссылка на другой экземпляр close_frame, созданный ранее, сохраняется. При разрушении, замыкание_кадр отсоединяется от замыкания и перекликается с предыдущим замыканием_кадра до этого случая.

Локальные переменные в закрытии «закрыть» выше по умолчанию построены в стеке внутренней функции «foo». Как только «фоо» выводится, все эти локальные переменные разрушаются. В некоторых случаях конструкция по умолчанию нежелательна, и нам нужно инициализировать локальные переменные закрытия с некоторыми значениями. Это можно сделать, пройдя в инициализаторах в совместимом кортеже. Совместимый кортеж - это один с тем же количеством элементов, что и пункт назначения, и где каждый элемент из пункта назначения может быть построен из каждого соответствующего элемента в источнике. Пример:

    tuple<int, char const*, int> init(123, "Hello", 1000);
    closure_frame<my_closure> frame(clos, init);

В настоящее время переменные нашего кадра закрытия инициализируются с помощью int: 123, char const*: "Hello" и int: 1000.



Статья Adaptable closures раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 08:35:38/0.0085070133209229/1