我正在编写一个带有(当前)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功能。答案 0 :(得分:2)
解决方案是将一方(或两者,如果您愿意)提升为可以保存所有重要信息的值。然后在升级后,每种类型只有一个操作。
例如,像3.33 * 2
这样的表达式应该是E_FLOAT * E_FLOAT。 4 / 2
应为E_INT / E_INT。 3.33 * "3"
应为E_FLOAT * E_FLOAT。