Это краткое введение в лямбда-выражения предназначено для читателей, незнакомых с библиотекойBoost MPL, которые хотят быстро получить рабочие знания основных понятий для целей их использования в Boost. Весом. Пожалуйста, обратитесь к Boost. Документация MPL для получения дополнительной информации помимо этих вводных примечаний.
Специфики, определенные Boost. Flyweight в значительной степени опирается на концепцию<Lambda
Expression>, определенную библиотекойBoost MPL.. Выражение лямбда можно рассматривать как «функцию типа» времени компиляции, сущность (конкретный тип, фактически), которая может быть вызвана с списком типов и возвращает некоторый связанный тип в свою очередь. Рассмотрим, например, произвольный шаблон класса:
template<typenameT,typenameQ>classfoo{...};
И предположим, что мы хотим иметь лямбда-выражение, которое, будучи вызвано некоторыми общими типами<Arg1>и<Arg2>, возвращается<foo<Arg1,Arg2>>. Такое выражение лямбда может быть реализовано двумя способами
< [12] >[скрыто]< [12] >[скрыто]< [13] >< [14] >];]std::set<std::string>, внутрифирменные МПЛП [скрыто],< [12] >[скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто]] [скрыто] [скрыто] [скрыто] [скрыто] [скрыто]] [скрыто] [скрыто] [скрыто] [скрыто]] [скрыто] [скрыто] [скрыто]] [скрыто] [скрыто] [скрыто]] [скрыто] [скрыто] [скрыто]] [скрыто] [скрыто] [скрыто]] [скрыто] [скрыто] [скрыто< [18] >,< [18] >,< [18] >,< [18] >,< [18] >,< [18] >,< [18] >,< [18] >,< [18] >,< [18] >,< [18] >. Чисто для этого, а также для метафункционирования, для того, чтобы остановить процесс вытеснения с рынка метафункционирования, а также для магии мета-языка, для того, чтобы избежать доверия.
Пока приведенные примеры просто переносят аргументы<Arg1>и<Arg2>непосредственно в шаблон класса без дальнейшей проработки, но ничто не мешает нам делать некоторые манипуляции с аргументами, например, переключать их места:КакMPL
Metafunction Class, тип с особым вложенным шаблоном класса под названиемapply:
structfoo_specifier{template<typenameArg1,typenameArg2>structapply{// this is the "return type" of foo_specifiertypedeffoo<Arg1,Arg2>type;};};
Обратите внимание, что в этом случаеfoo_specifierявляется конкретным типом, так же, какintилиstd::set<std::string>; тем не менее, внутренние механизмы MPL способны обнаружить, что этот тип был получен от инстанцирования шаблона класса с заполнителямиboost::mpl::_1иboost::mpl::_2и принять эти заполнители в качестве слотов для замены фактических типов (первый и второй тип поставляется, соответственно), когдаfoo_specifierвызывается. Для того, чтобы вернуться кfooклассу шаблона самfoo! Чистый эффект такой же, как и в случае с метафункциями, но выражения заполнителей избавляют нас от необходимости писать классы метафункций, а магия метапрограммирования, от которой они зависят, имеет неоспоримую красоту.
So far the examples shown just forward the arguments Arg1 and
Arg2 directly to a class template without further elaboration,
but there is nothing preventing us from doing some argument manipulation,
like, for instance, switching their places:
[ORIG_END] -->
Статья Boost.Flyweight Documentation - Tutorial - Annex - MPL lambda expressions раздела Boost.Flyweight Documentation - Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.