#include #include #include using namespace boost; using namespace boost::proto; struct vec : or_< when< subscript< plus, terminal<_> > , functional::make_expr( functional::make_expr( _left(_left), _right ), functional::make_expr( _right(_left), _right ) ) > , plus< vec, vec > , terminal< _ > > {}; struct arg1_tag {}; terminal::type const arg1 = {}; struct arg2_tag {}; terminal::type const arg2 = {}; int main() { display_expr((arg1+arg2+arg1)[1]); display_expr(vec()((arg1+arg2+arg1)[1])); }