![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Adaptable closuresBoost , ,
Структура не будет полной без какой-либо поддержки закрытия. Закрытия инкапсулируют рамку стека, где локальные переменные создаются при входе в функцию и разрушаются при выходе. Закрытие обеспечивает среду для проживания локальных переменных. Закрытие может удерживать разнородные типы. Закрытие Phoenix - это настоящий аппаратный стек. Закрытие обеспечивает истинное возвращение в функции лямбды. Закрытие обеспечивает доступ к кадру стека функций, где находятся локальные переменные. Смоделированные после рамок вложенных стеков Pascal, затворы могут быть вложены так же, как вложенные функции, где код во внутренних затворах может получить доступ к локальным переменным из внешних затворов в масштабе (доступ к внутренним областям из внешних областей является ошибкой и вызовет сбой утверждения времени выполнения).
Существует три (3) взаимодействующих класса: 1 закрытие:<1 В точке декларирования закрытие еще не создает рамки стека и не инстанцирует какие-либо переменные. В декларации о закрытии указываются типы и названия местных переменных. Класс закрытия должен быть подклассирован. Ответственность за закрытие подкласса заключается в предоставлении имен для каждой локальной переменной в закрытие. Пример:
Теперь, когда у нас есть «закрытие», к его локальным переменным можно лениво получить доступ, используя обозначение точки. Каждая квалифицированная локальная переменная может быть использована так же, как и любой примитивный актор. Примеры:
Приведенные выше примеры лениво оцениваются. Как обычно, эти выражения возвращают составные акторы, которые будут оцениваться через вызов второй функции (см. операторы). Каждый из участников (clos.xxx) является актером. Таким образом, применение оператора () покажет его личность:
2 close_member Названные локальные переменные закрытия «закрыть» выше фактически являются членами закрытия. Класс Close_member является действующим лицом и соответствует его концептуальному интерфейсу. Member1..memberN - это предварительно определенные типдефы, которые соответствуют каждому из перечисленных типов в параметрах шаблона закрытия. 3 close_frame Когда закрывающий элемент наконец оценивается, он должен ссылаться на фактический экземпляр переменной в аппаратном стеке. Без этого процесс не будет завершен, и оцениваемый участник приведет к провалу утверждения. Помните, что закрытие – это просто декларация. Местные переменные, к которым относится закрытие, все еще должны быть инстанцированы. Класс close_frame выполняет фактическую инстантацию локальных переменных и связывает эти переменные с закрытием и всеми его членами. Может быть несколько экземпляров рамок закрытия, обычно расположенных в стеке внутри функции. Каждый экземпляр close_frame инициирует кадр стека с новым набором локальных переменных закрытия. Пример:
где «закрытие» является примером нашего закрытия «my_closure» выше. Обратите внимание, что использование выше исключает локально объявленные классы. Если my_closure является локально объявленным типом, мы все равно можем использовать его self_type в качестве параматера для закрытия_frame:
После инстанциации, файл close_frame связывает локальные переменные с замыканием. Предыдущая ссылка на другой экземпляр close_frame, созданный ранее, сохраняется. При разрушении, замыкание_кадр отсоединяется от замыкания и перекликается с предыдущим замыканием_кадра до этого случая. Локальные переменные в закрытии «закрыть» выше по умолчанию построены в стеке внутренней функции «foo». Как только «фоо» выводится, все эти локальные переменные разрушаются. В некоторых случаях конструкция по умолчанию нежелательна, и нам нужно инициализировать локальные переменные закрытия с некоторыми значениями. Это можно сделать, пройдя в инициализаторах в совместимом кортеже. Совместимый кортеж - это один с тем же количеством элементов, что и пункт назначения, и где каждый элемент из пункта назначения может быть построен из каждого соответствующего элемента в источнике. Пример:
В настоящее время переменные нашего кадра закрытия инициализируются с помощью int: 123, char const*: "Hello" и int: 1000.
Copyright © 2001-2002 Joel de Guzman Статья Adaptable closures раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |