使结构的所有数学运算符操作相同的成员

use*_*896 16 c++ struct operators

我有一个包含double和几个标志的结构,但我想在我的代码中使用它,好像它只是那个双.有没有办法简化下面的代码,以便在这个结构的实例上执行的所有数学运算符都在包含的double上执行?我的代码运行但我怀疑C++有一个非常优雅和简短的解决方案来解决我的问题.

struct SomeStruct
{
    double value;
    bool someFlag;
    bool someOtherFlag;

    operator double(){return value;}

    void operator=(double newValue){value = newValue;}
    void operator+=(double valueToAdd){value += valueToAdd;}
    void operator-=(double valueToSubtract){value-= valueToSubtract;}
    void operator/=(double divisor){value /= divisor;}
    void operator*=(double multiplier){value *= multiplier;}
    double operator+(double valueToAdd){return value + valueToAdd;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 25

如果您将转换运算符更改为operator double &,则可以double免费获得所有运算符,但以下情况除外operator=:

#include <iostream>

struct Foo {
    double d;
    bool flag;

    Foo() : d(0), flag(false) {}

    operator double &() { return d; }
};

int main()
{
    Foo x;  // initialized to (0, false)
    x.flag = true;
    x += 1.1;
    std::cout << x.d << " " << x.flag << std::endl;
    x *= 2;
    std::cout << x.d << " " << x.flag << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

版画

1.1 1
2.2 1
Run Code Online (Sandbox Code Playgroud)

(第二个输出是flag).

可能仍然值得定义operator double() const.

  • 回答问题不是必需的,但我也添加了一个`const`重载. (7认同)
  • 我可能会遗漏一些明显的东西,但标准中的哪条规则说`x`将被初始化为`(0,false)`(而不是具有不确定的值)? (3认同)
  • 我强烈**建议你不要这样做.这种类型的隐式转换是等待发生的事故.你认为你很聪明,它可以在一段时间内保持可爱,但最终它最终变成了一个你不想放下的兔子洞. (2认同)