【发布时间】:2014-01-04 11:59:25
【问题描述】:
我正在编写一个带有(当前)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 功能。
【问题讨论】:
-
如果两者之一是
E_FLOAT,则将另一个转换为E_FLOAT。如果是E_STRING,则将其转换为适当的值(整数或浮点)。然后你会得到E_INT x E_INT和E_FLOAT x E_FLOAT操作。 -
好的,感谢您的帮助!
-
顺便说一句,您使用
float而不是double是因为您知道自己在做什么,还是因为您不知道? ;-) -
我使用 float 是因为我认为它的大小与 int 和 void * 相同。认为这在 64 位机器上可能不是真的,不确定,我还没有想过这个。
-
@Virus721:在常见的 64 位架构上,
int和float都小于void*。我的观点是,在实践中float算术很容易遇到精度问题——当然double最终也会遇到,但事实证明,它对于 很多 比 @ 更实际的情况来说已经足够好了987654335@ 是。同样,计算机实际上可以数到 2^32,但不能数到 2^64。
标签: c++ types operators combinations