PETE allows you to construct a nested type for the parse tree and to build objects of that type. The type for the C*D sub-tree would be (in simplified form) Expression<OpMultiply,Array,Array>. This is a flat representation of a simple tree in which the central node is of type OpMultiply and the leaves are both of type Array.
PETE allows you to treat this nested template data structure as a container, and iterate over the leaves, which are the elements of the expression using multiple forms of a for_each function. The user can specify what kind of operation to perform at the leaves, whether to pull out a value or a type, and how to combine those while moving through the tree.
The effect of this design is that the expression template machinery can be separated from the array class, enormously simplifying the process of adding expression templates to user classes.
A second extension was proposed and designed to simplify writing the many expression template operators that must be written for a given array class. The final design chosen was a small specification file which is processed by a script to produce the header files for the user.
Together these represent a significant extension of the capabilities of PETE and a simplification of its use.
A second major plan for FY99 is a further extension of the PETE interface to handle some cases it currently does not. Right now PETE is designed so that when operating on an array class and an unknown type, it assumes that the unknown type is a scalar. This is a valuable mode of operation, but it conflicts with some users' expressed desires because it interferes with inheriting from the users' array classes. We have at this time designed a solution to this, and are preparing to implement and document it.