我正在编写一个小型解析器,其中(目前)有 3 种标量数据类型:int、float 和字符串(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。