使结构体的所有数学运算符操作同一成员
Making all mathematical operators of a struct manipulate the same member
我有一个结构体包含一个双精度体和几个标志,但是我想在我的代码中使用它,就好像它只是那个双精度体一样。是否有一种方法可以简化以下代码,以便在此结构体的实例上执行的所有数学运算符都在包含双精度对象上执行?我的代码运行,但我怀疑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;}
...
}
如果您将转换操作符更改为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;
}
打印
1.1 1
2.2 1
(第二个输出是flag
)。
也可以定义operator double() const
把我们在评论中的讨论变成一个答案…
我认为你根本不应该做这件事。正如您在评论中提到的,您的结构体包含来自声学测量的信息,因此它既有值也有标志,表明噪声测量是否使记录仪器过载。让我把你的结构简化成这样:
struct Noise
{
double noiseLevel;
bool overload;
};
现在让我们假设您添加了一个转换操作符,从而获得了转换操作符提供的轻松和方便。现在你有两个噪声测量quiet
和loud
。loud
有过载标志设置,而quiet
没有。现在您可以执行以下两个操作,读者应该期望它们产生相同的结果:
loud += quiet;
和
quiet += loud;
,但是因为你的加法不尊重标志,两个操作产生不同的值。在第一个中,设置了overload
标志,而在第二个中没有设置。在我看来,这是非常令人不安的行为。因此,我建议您实现自己的、尊重类型的、以自然方式保留overlaud
标志的操作符,例如
Noise& operator+=(Noise& lhs, const Noise& rhs)
{
lhs.value += rhs.value;
lhs.overload |= rhs.overload;
return lhs;
}
相关文章:
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- 余数运算符的等效操作,用于处理低于允许的最小值
- 运算符 << 操作加载的 API for std::endl?
- 如何通过使用 2 位或更多数字的 XOR 运算符来执行此操作C++问题
- 操作后通过运算符分配对象
- 使用">"运算符增强语义操作
- 如何让迭代器使用赋值运算符对列表进行操作
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- 从文件中读取运算符并执行操作C++
- c++操作1运算符、操作2的未知值
- 使用重载运算符在函数调用时执行操作
- C++功能运算符结构不执行任何操作
- 对具有父类的子类的运算符 = 的操作
- isSet() 或运算符 void*() 或显式操作程序 bool() 或其他东西
- 在我的Matrix4类中使用某些用户定义的运算符的操作正在返回高值的高值
- 位字段操作中的运算符[] 重载?
- 在c++中操作重载赋值运算符
- 由于某种原因,使用 OR 运算符执行操作不起作用
- 在将对象传递给函数时,我必须重载哪些运算符才能查看所有操作
- 不带赋值运算符的位NOT操作-可能