为两个双精度浮点数重载运算符%的C++实现

4

是否可能为两个双精度浮点数重载operator%运算符?

const double operator%(const double& lhs, const double& rhs)
{
    return fmod(lhs, rhs);
}

当然,这会导致错误,因为两个参数中必须有一个是类类型。所以我想到利用C++的隐式构造函数调用来解决这个问题。我是这样做的:
class MyDouble {
public:
    MyDouble(double val) : val_(val) {}
    ~MyDouble() {}

    double val() const { return val_; }

private:
    double val_;
};


const double operator%(const MyDouble& lhs, const double& rhs)
{
    return fmod(lhs.val(), rhs);
}

const double operator%(const double& lhs, const MyDouble& rhs)
{
    return fmod(lhs, rhs.val());
}

...和:

double a = 15.3;
double b = 6.7;

double res = a % b; // hopefully calling operator%(const MyDouble&, const double) using a implicit constructor call

很遗憾,这并不起作用!欢迎任何提示、想法......谢谢! 提前致谢, 乔纳斯


3
为什么不直接调用fmod(),而在不必要的地方搞操作符重载呢?请思考一下。 - Nim
2个回答

9
这段代码无法成功运行的原因是,仅当表达式中至少有一个操作数具有类或枚举类型时,才会触发用户定义的运算符函数的重载决议。
所以你很遗憾。这不会起作用。
我认为你最好尝试等待C++0x编译器,然后使用用户定义字面量,而不是写3.14,你可以写成3.14_myd

0

或者,可以这样实现double MyDouble::operator%(const double&) const;

#include <iostream>
#include <cmath>

class t_double {
public:
    t_double(const double& val) : d_val(val) {
    }

    t_double(const t_double& other) : d_val(other.d_val) {
    }

    ~t_double() {
    }

    const double& val() const {
        return this->d_val;
    }

    double operator%(const double& rhs) const {
        return fmod(this->val(), rhs);
    }

    double operator%(const t_double& rhs) const {
        return fmod(this->val(), rhs.val());
    }

private:
    double d_val;
};

int main(int argc, char* const argv[]) {

    const t_double a(15.3);
    const t_double b(6.7);

    std::cout << a % b << " == " << a.val() << " % " << b.val() << "\n";

    return 0;
}

我考虑过这种方式,但是没有成功:( 如果有一个小例子,我会非常高兴!谢谢! - Jonas
好的,但是如果你将const t_double a(15.3);改为double a = 15.3;(对于b也是如此),那么代码就无法编译。而且在代码中,我想使用的不是t_double,而是double。 - Jonas
它无法编译,因为您必须声明自由函数:double operator%(const double& lhs, const t_double& rhs) { return t_double(lhs) % rhs; } - justin
我曾经认为你说的 double a; t_double b; a % b 无法编译。 - justin
不,我想要的是以下内容:double a = 14.3; double b = 11.23; double c = a % b; - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接