在我的C ++项目中,由于数字错误,我经常遇到不精确的结果。是否有可能以某种方式重新定义标准比较运算符(==
,<=
,>=
,<
,>
),以便它们不能完全比较但是在可接受的错误范围内(例如1e-12
)?
(如果是的话,这样做是个好主意吗?)
(当然可以编写比较函数,但人们可以直观地使用运算符。)
答案 0 :(得分:3)
要重载运算符,某些参数必须是用户定义的类型。内置的固定且不可更改。
但即使你能做到这也不是一件好事。帮自己一个忙,并提供自定义比较“运算符”作为一组函数,选择一个暗示他们使用的策略的名称。如果没有正确的指示,表示严格或使用DBL_EPSILON或2 * DBL_EPSILON或某些任意线性或缩放公差,您就不能指望代码阅读器知道。
答案 1 :(得分:2)
您无法为标准类型(int
,float
,char
等)重载运算符
你当然可以声明一个类型:
class Float
{
private:
float f;
public:
Float(float v) : f(v) {}
... bunch of other constructors.
friend bool operator==(Float &a, Float &b);
... more operators here.
float operator float() { return f; }
};
bool operator==(Float &a, Float &b) { return (fabs(b.f-a.f) < epsilon); }
bool operator==(Float &a, const float &b) { return (fabs(b-a.f) < epsilon); }
... several other operator declarations - need on also make operator
(上面的代码是“作为一个想法”,没有经过测试,也许需要更多工作才能“好”)。
当然,你需要一些丑陋的typedef或宏来代替代码中的“Float”和“Float”。
答案 2 :(得分:1)
不,您不能为内置类型重载运算符。 不,改变运营商的语义(一般来说)不是一个好主意。
你可以:
double
成员编写包装类。