我正在编写一个具有(当前)3个标量数据类型的小型解析器:int,float和string(char *):

typedef enum eValueType
{
    E_INT, E_FLOAT, E_STRING
}
eValueType;

class CValue
{
protected:

    union
    {
        int _i; float _f; char * _s;
    };

    eValueType _eType;

    // ...
};


我想重载所有需要的运算符(+,-,*,/,&&,||等),以便我可以轻松地操纵CValue对象。问题在于要定义的行为数量是组合的:

CValue operator + ( const CValue & roVal )
{
    switch( roVal._eType ) {
    case E_INT :
        switch( this->_eType )  {
        case E_INT :
            break;
        case E_FLOAT :
            break;
        case E_STRING :
            break;
        }
        break;

    case E_FLOAT :
        switch( this->_eType )  {
        case E_INT :
            break;
        case E_FLOAT :
            break;
        case E_STRING :
            break;
        }
        break;

    case E_STRING :
        switch( this->_eType )  {
        case E_INT :
            break;
        case E_FLOAT :
            break;
        case E_STRING :
            break;
        }
        break;
    }
}


那就是我只有3种类型,对于单个运算符,却没有在每种情况下都必须添加的代码。如果添加函数,数组等,我无法想象。

我是否可以使用某种设计模式或方法来减少为处理每个运算符而必须处理的每种类型的代码量?

谢谢 :)

编辑:我想避免C ++ 11功能。

最佳答案

解决方案是将一个方面(或如果您愿意的话,两个方面)提升为可以容纳所有重要信息的值。然后,升级后,每种类型只有一个操作。

例如,类似3.33 * 2的表达式应为E_FLOAT * E_FLOAT。 4 / 2应为E_INT / E_INT。并且3.33 * "3"应该是E_FLOAT * E_FLOAT。

关于c++ - int/float/string值之间的运算,太多组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20920695/

10-13 08:08