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

Boilerplate Macros

Boost , Chapter 1. Phoenix 3.2.0 , Phoenix Expressions

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

PrevUpHomeNext

Имея все больше и больше выражений, вы начинаете понимать, что это очень показательная задача. Phoenix предоставляет шаблонные макросы, которые определяют выражения Феникса, как вы видели в предыдущем разделе Выглядит как кусок пирога.

Description

BOOST_PHOENIX_DEFINE_EXPRESSION - это макрос, который можно использовать для создания всех необходимых шаблонов для создания экспрессий Феникса

Synopsis
BOOST_PHOENIX_DEFINE_EXPRESSION(
    (namespace_seq)(name)
  , (child_grammar0)
    (child_grammar1)
    ...
)
Semantics

Приведенный выше макрос генерирует необходимый код для выражения name в пространстве имен namespace_seq. Последовательность (child_grammarN) заявляет, сколько детей будет иметь это выражение, и что proto::grammar они совпадают.

Макро следует использовать в глобальном масштабе. namespace_seq - последовательность пространств имен, под которой будут определены следующие символы:

namespace tag
{
    struct name;
}
namespace expression
{
    template <typename A0, typename A1 ... typename AN>
    struct name
        : boost::phoenix::expr<
            tag::name
          , A0
          , A1
            ...
          , AN
        >
}
namespace rule
{
    struct name
        : boost::phoenix::expr<
            child_grammar0
          , child_grammar1
            ...
          , child_grammarN
        >
    {};
}
namespace functional
{
    struct make_name; // A polymorphic function object that can be called to create the expression node
}
namespace result_of
{
    template <typename A0, typename A1 ... typename AN>
    struct make_name; // The result type of the expression node
}
// convenience polymorphic function to create an expression node
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);

Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>, чтобы включить правило для дальнейшего использования в действиях.

Header
#include <boost/phoenix/core/expression.hpp>
Example

Пример из предыдущего раздела можно переписать так:

BOOST_PHOENIX_DEFINE_EXPRESSION(
    (plus)
  , (meta_grammar)               // Lhs
    (meta_grammar)               // Rhs
)
template <typename Lhs, typename Rhs>
typename plus<Lhs, Rhs>::type
plus(Lhs const & lhs, Rhs const & rhs)
{
    return expression::plus<Lhs, Rhs>::make(lhs, rhs);
}
Description

BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG - это макрос, который можно использовать для создания всех необходимых шаблонов для создания экспрессий Феникса

Synopsis
BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG(
    (namespace_seq)(name)
  , (child_grammar0)
    (child_grammar1)
    ...
    (child_grammarN)
  , N
)
Semantics

Приведенный выше макрос генерирует необходимый код для выражения name в пространстве имен namespace_seq. N - максимальное число детей. Все, кроме последних элементов грамматической последовательности, необходимы детям выражения, а последнее обозначает переменное число детей. Число детей, которое может содержать такое выражение, составляет N-1 плюс размер последовательности

Макро следует использовать в глобальном масштабе. namespace_seq - последовательность пространств имен, под которой будут определены следующие символы:

namespace tag
{
    struct name;
}
namespace expression
{
    template <typename A0, typename A1 ... typename AN>
    struct name
        : boost::phoenix::expr<
            tag::name
          , A0
          , A1
            ...
          , AN
        >
    {};
}
namespace rule
{
    struct name
        : expression::name<
            child_grammar0
          , child_grammar1
            ...
          , proto::vararg<child_grammarN>
        >
    {};
}
namespace functional
{
    struct make_name; // A polymorphic function object that can be called to create the expression node
}
namespace result_of
{
    template <typename A0, typename A1 ... typename AN>
    struct make_name; // The result type of the expression node
}
// convenience polymorphic function to create an expression node
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);

Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>, чтобы включить правило для дальнейшего использования в действиях.

Header
#include <boost/phoenix/core/expression.hpp>
Example
BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG(
    (boost)(phoenix)(mem_fun_ptr)
  , (meta_grammar)                // Pointer to Object
    (meta_grammar)                // Member pointer
    (meta_grammar)                // Variable number of arguments
  , BOOST_PHOENIX_LIMIT
)

Это определяет выражение оператора указателя функции участника, как описано в операторах.

Description

BOOST_PHOENIX_DEFINE_EXPRESSION_EXT - это макрос, который можно использовать для создания всех необходимых шаблонов для создания Phoenix Expressions

Synopsis
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT(
    actor
  , (namespace_seq)(name)
  , (child_grammar0)
    (child_grammar1)
    ...
    (child_grammarN)
  , N
)
Semantics

Приведенный выше макрос генерирует необходимый код для выражения name в пространстве имен namespace_seq. Последовательность (child_grammarN) заявляет, сколько детей будет иметь это выражение, и что proto::grammar они совпадают.

Макро следует использовать в глобальном масштабе. namespace_seq - последовательность пространств имен, под которой будут определены следующие символы:

namespace tag
{
    struct name;
}
namespace expression
{
    template <typename A0, typename A1 ... typename AN>
    struct name
        : boost::phoenix::expr_ext<
            actor
          , tag::name
          , A0
          , A1
            ...
          , AN
        >
}
namespace rule
{
    struct name
        : boost::phoenix::expr<
            child_grammar0
          , child_grammar1
            ...
          , child_grammarN
        >
    {};
}
namespace functional
{
    struct make_name; // A polymorphic function object that can be called to create the expression node
}
namespace result_of
{
    template <typename A0, typename A1 ... typename AN>
    struct make_name; // The result type of the expression node
}
// convenience polymorphic function to create an expression node
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);

Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>, чтобы включить правило для дальнейшего использования в действиях.

Header
#include <boost/phoenix/core/expression.hpp>
Example
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT(
    if_actor
  , (boost)(phoenix)(if_)
  , (meta_grammar) // Cond
    (meta_grammar) // Then
)

Это определяет выражение if_. Пользователь определяет else_ как участник.

Description

BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG - это макрос, который можно использовать для создания всех необходимых шаблонов для создания Phoenix Expressions

Synopsis
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG(
    actor
  , (namespace_seq)(name)
  , (child_grammar0)
    (child_grammar1)
    ...
    (child_grammarN)
  , N
)
Semantics

Приведенный выше макрос генерирует необходимый код для выражения name в пространстве имен namespace_seq. N - максимальное число детей. Все, кроме последних элементов грамматической последовательности, необходимы детям выражения, а последнее обозначает переменное число детей. Число детей, которое может содержать такое выражение, составляет N-1 плюс размер последовательности

Макро следует использовать в глобальном масштабе. namespace_seq - последовательность пространств имен, под которой будут определены следующие символы:

namespace tag
{
    struct name;
}
namespace expression
{
    template <typename A0, typename A1 ... typename AN>
    struct name
        : boost::phoenix::expr_ext<
            actor
          , tag::name
          , A0
          , A1
            ...
          , AN
        >
    {};
}
namespace rule
{
    struct name
        : expression::name<
            child_grammar0
          , child_grammar1
            ...
          , proto::vararg<child_grammarN>
        >
    {};
}
namespace functional
{
    struct make_name; // A polymorphic function object that can be called to create the expression node
}
namespace result_of
{
    template <typename A0, typename A1 ... typename AN>
    struct make_name; // The result type of the expression node
}
// convenience polymorphic function to create an expression node
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);

Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>, чтобы включить правило для дальнейшего использования в действиях.

Header
#include <boost/phoenix/core/expression.hpp>
Example

ТБД


PrevUpHomeNext

Статья Boilerplate Macros раздела Chapter 1. Phoenix 3.2.0 Phoenix Expressions может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Phoenix Expressions ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:15:35/0.0046849250793457/0