typedef boost::shared_ptr Expression; class BinaryOperator { Expression left; Expression right; public: BinaryOperator(Expression lval, Expression rval); template virtual T GetValue(T (Base::*fun)(void) const) const = 0; }; class Add : public BinaryOperator {}; class Subtract : public BinaryOperator {}; Creation: | expr '+' expr { $$ = e(new tValue::Add(*$1, *$3)); delete $1, $3; } Use: int currentSize = currentSizeValue.getValue();