expression * translator::expression_plus(expression *lhs, expression *rhs) { switch (std::pair(lhs->e_id, rhs->e_id)) { case std::pair(TYPE_INTEGER, TYPE_INTEGER): return new expression_add_integer(lhs, rhs); case std::pair(TYPE_REAL, TYPE_INTEGER): rhs = cast_int_real_factory(rhs); return new expression_add_real(lhs, rhs); case std::pair(TYPE_INTEGER, TYPE_REAL): lhs = cast_int_real_factory(lhs); return new expression_add_real(lhs, rhs); case std::pair(TYPE_REAL, TYPE_REAL): return new expression_add_real(lhs, rhs); } error("invalud additon expression"); return new expression_error(); } | class translator { blah blah private: binary_dispatch op_add; blah blah }; void translator::translator() { blah blah op_plus.push_back(type_integer::is_a, type_integer::is_a, &translator::expression_plus_integer_factory); op_plus.push_back(type_real::is_a, type_real::is_a, &translator::expression_plus_real_factory); op_plus.push_back(type_integer::is_a, type_real::is_a, &translator::expression_integer_plus_real); blah blah } expression * translator::expression_plus(expression *lhs, expression *rhs) { return op_plus.dispatch(lhs, rhs); } expression * translator::expression_integer_plus_real(expression *lhs, expression *rhs) { lhs = cast_int_real_factory(lhs); return expression_plus_real_factory(lhs, rhs); } |
Problem:
we replaced those id things with vptrs.
|