Struct template external_transforms
boost::proto::external_transforms — A map from grammars to transforms, used as a way to externally associate transforms.
Synopsis
template<typename... When>
struct external_transforms {
typedef mpl::map< typename to_mpl_pair< When >::type... > map_type;
template<typename Grammar>
struct when :
proto::otherwise< typename mpl::at< map_type, Grammar >::type >
{
};
};
Description
Иногда желательно определить грамматику, которая может быть настроена с различными наборами преобразований. Для этого, где вы обычно указываете преобразование в грамматике, вы можете вместо этого поставить<proto::external_transform
>; например:<proto::when< some_grammar, proto::external_transform >
>. Затем, вызывая грамматику, вы можете пройти пример<proto::external_transforms
>в качестве параметра данных. Когда выражение совпадает<some_grammar
>, Proto будет искать преобразование аппроприта в параметре данных, используя<some_grammar
>в качестве ключа.
struct int_terminal
: proto::terminal<int>
{};
struct char_terminal
: proto::terminal<char>
{};
struct my_grammar
: proto::or_<
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 >
>
>
{};
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;
my_grammar()(i + c, 0, trx);
my_grammar()(i + c, 0, (proto::data = 42, proto::transforms = trx));