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

THE BOOST MPL LIBRARY: Placeholders

Boost , ,

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

Front Page / Tutorial: Metafunctions and Higher-Order Metaprogramming / Lambda Details / Placeholders

Placeholders

Определение "placeholder" может вас удивить:

Definition

placeholder представляет собой класс метафункций формы mpl::arg.

Implementation

Удобные имена _1, , ..._5 на самом деле typedefs для специализаций mpl::arg, которые просто выбирают N-й аргумент для любого N. [6] Реализация заполнителей выглядит примерно так:

[6]MPL предоставляет пять заполнителей по умолчанию. См. раздел Configuration Macros справочное руководство по MPL для описания того, как изменить количество заполнителей.
namespace boost { namespace mpl { namespace placeholders {
template <int N> struct arg; // forward declarations
struct void_;
template <>
struct arg<1>
{
    template <
      class A1, class A2 = void_, ... class Am = void_>
    struct apply
    {
        typedef A1 type; // return the first argument
    };
};
typedef arg<1> _1;
template <>
struct arg<2>
{
    template <
      class A1, class A2, class A3 = void_, ...class Am = void_
    >
    struct apply
    {
        typedef A2 type; // return the second argument
    };
};
typedef arg<2> _2;
more specializations and typedefs...
}}}

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

The Unnamed Placeholder

Есть один специальный заполнитель, известный как безымянный заполнитель , который мы еще не определили:

namespace boost { namespace mpl { namespace placeholders {
typedef arg<-1> _; // the unnamed placeholder
}}}

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

the nth appearance of the unnamed placeholder in a given template specialization is replaced with _n.

Так, например, каждая строка таблицы 1.1 ниже содержит два эквивалентных выражения лямбда.

Unnamed Placeholder Semantics
 mpl::plus<_,_> 
 mpl::plus<_1,_2> 
 boost::is_same<_, boost::add_pointer<_> > 
 boost::is_same<_1, boost::add_pointer<_1> > 
 mpl::multiplies, mpl::minus<_,_gt; > 
 mpl::multiplies, mpl::minus<_1,_2> > 

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

Статья THE BOOST MPL LIBRARY: Placeholders раздела может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:55:24/0.0060508251190186/0