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

Boost.Flyweight Documentation - Tutorial - Annex - MPL lambda expressions

Boost , , Boost.Flyweight Documentation - Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost.Flyweight Tutorial Annex: MPL lambda expressions



Это краткое введение в лямбда-выражения предназначено для читателей, незнакомых с библиотекойBoost MPL, которые хотят быстро получить рабочие знания основных понятий для целей их использования в Boost. Весом. Пожалуйста, обратитесь к Boost. Документация MPL для получения дополнительной информации помимо этих вводных примечаний.

Специфики, определенные Boost. Flyweight в значительной степени опирается на концепцию<Lambda Expression>, определенную библиотекойBoost MPL.. Выражение лямбда можно рассматривать как «функцию типа» времени компиляции, сущность (конкретный тип, фактически), которая может быть вызвана с списком типов и возвращает некоторый связанный тип в свою очередь. Рассмотрим, например, произвольный шаблон класса:

template<typename T,typename Q>
class foo
{
  ...
};

И предположим, что мы хотим иметь лямбда-выражение, которое, будучи вызвано некоторыми общими типами<Arg1>и<Arg2>, возвращается<foo<Arg1,Arg2>>. Такое выражение лямбда может быть реализовано двумя способами

    .
  1. Делать< [0] >, стр. стр., стр., стр., стр., стр., стр., стр.< [1] >:
    < [2] >
  2. < [10] >, пробоотражающая способность,[полностью]:
    < [11] >
    < [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_specifier
   typedeffoo<Arg1,Arg2>type;
 };
};
  • КакMPL Placeholder Expression, шаблон класса, инстанцированный с одним или несколькимизаполнителями:
    typedeffoo<boost::mpl::_1,boost::mpl::_2>foo_specifier;
    
    Обратите внимание, что в этом случае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] -->

    struct foo_specifier
    {
      template<typename Arg1,typename Arg2>
      struct apply{typedef foo<Arg2,Arg1> type;};
    };
    typedef foo<boost::mpl::_2,boost::mpl::_1> foo_specifier;
    

    Субэкспрессии в качестве аргументов для общего выражения:

    struct foo_specifier
    {
      template<typename Arg1,typename Arg2>
      struct apply{typedef foo<boost::shared_ptr<Arg1>,std::less<Arg2> > type;};
    };
    typedef foo<
      boost::shared_ptr<boost::mpl::_1>,
      std::less<boost::mpl::_2>
    > foo_specifier;
    

    или принимать меньше или больше аргументов, чем сам шаблон класса (количество параметров выражения лямбда называется егоаритмией):

    struct foo_specifier
    {
      template<typename Arg1>
      struct apply{typedef foo<Arg1,std::less<Arg1> type;};
    };
    typedef foo<boost::mpl::_1,std::less<boost::mpl::_1> > foo_specifier;
    struct foo_specifier
    {
      template<typename Arg1,typename Arg2,typename Arg3>
      struct apply{typedef foo<Arg1,foo<Arg2,Arg3> > type;};
    };
    typedef foo<boost::mpl::_1,foo<boost::mpl::_2,boost::mpl::_3> > foo_specifier;
    



    Пересмотрено 13 августа 2008 года

    © Copyright 2006-2008 Joaquín M López Muñoz. Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию по адресуhttp://www.boost.org/LICENSE_1_0.txt)

    Статья Boost.Flyweight Documentation - Tutorial - Annex - MPL lambda expressions раздела Boost.Flyweight Documentation - Tutorial может быть полезна для разработчиков на c++ и boost.




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



    :: Главная :: Boost.Flyweight Documentation - Tutorial ::


    реклама


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

    Время компиляции файла: 2024-08-30 11:47:00
    2025-07-05 02:29:56/0.0042099952697754/0