【问题标题】:Operations between int/float/string values, too many combinationsint/float/string 值之间的操作,组合太多
【发布时间】: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_INTE_FLOAT x E_FLOAT 操作。
  • 好的,感谢您的帮助!
  • 顺便说一句,您使用float 而不是double 是因为您知道自己在做什么,还是因为您不知道? ;-)
  • 我使用 float 是因为我认为它的大小与 int 和 void * 相同。认为这在 64 位机器上可能不是真的,不确定,我还没有想过这个。
  • @Virus721:在常见的 64 位架构上,intfloat 都小于 void*。我的观点是,在实践中float 算术很容易遇到精度问题——当然double 最终也会遇到,但事实证明,它对于 很多 比 @ 更实际的情况来说已经足够好了987654335@ 是。同样,计算机实际上可以数到 2^32,但不能数到 2^64。

标签: c++ types operators combinations


【解决方案1】:

解决方案是将一侧(或两者,如果您愿意)提升为可以包含所有重要信息的值。那么在提升之后,你就只能对每种类型进行一次操作了。

例如,3.33 * 2 之类的表达式应该是 E_FLOAT * E_FLOAT。 4 / 2 应该是 E_INT / E_INT。而3.33 * "3" 应该是 E_FLOAT * E_FLOAT。

【讨论】:

  • 感谢您的回答,我会看看我能用这个想法做什么。
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多