Back Next

Method Method

We solve this with a multi method, something C++ has no direct support for...
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.