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));