Boost C++ 库

...世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码规范

结构体模板 external_transforms - Boost C++ 函数库
PrevUpHomeNext

结构体模板 external_transforms

boost::proto::external_transforms — 一个从语法到转换的映射,用作外部关联转换的一种方式。

提要

// In header: <boost/proto/transform/when.hpp>

template<typename... When> 
struct external_transforms {
  // types
  typedef mpl::map< typename to_mpl_pair< When >::type... > map_type;  // For exposition only.

  // member classes/structs/unions
  template<typename Grammar> 
  struct when :
     proto::otherwise< typename mpl::at< map_type, Grammar >::type >
  {
  };
};

描述

有时希望定义一个可以利用不同的转换集进行定制的语法。为此,在语法中通常指定转换的地方,您可以改为放置 proto::external_transform;例如:proto::when< some_grammar, proto::external_transform >。然后,在调用语法时,您可以将适当定义的 proto::external_transforms 实例作为 Data 参数传递。当表达式匹配 some_grammar 时,Proto 会使用 some_grammar 作为键,在 Data 参数中查找相应的转换。

struct int_terminal
  : proto::terminal<int>
{};

struct char_terminal
  : proto::terminal<char>
{};

struct my_grammar
  : proto::or_<
        // The next two grammar rules are customization points.
        // The associated transforms are specified externally
        // using external_transforms below.
        proto::when< int_terminal, proto::external_transform >
      , proto::when< char_terminal, proto::external_transform >
      , proto::when<
            proto::plus< my_grammar, my_grammar >
          , proto::fold< proto::_, int(), my_grammar >
        >
    >
{};

// Here is where the transforms are associated with the
// grammar rules above.
struct my_transforms
  : proto::external_transforms<
        proto::when<int_terminal, print(proto::_value)>
      , proto::when<char_terminal, print(proto::_value)>
    >
{};

// ...

proto::literal<int> i(1);
proto::literal<char> c('a');
my_transforms trx;

// Evaluate "i+c" using my_grammar with the specified transforms:
my_grammar()(i + c, 0, trx);

// If you would also like to pass arbitrary data along with the
// transforms, you can use a transform environment, as so:
my_grammar()(i + c, 0, (proto::data = 42, proto::transforms = trx));


PrevUpHomeNext