C ++重载运算符%为两个双精度数

时间:2011-04-28 11:18:08

标签: c++ double overloading operator-keyword

是否可以将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

不幸的是,这不起作用!任何提示,想法,...表示赞赏! 提前致谢, 纳斯

2 个答案:

答案 0 :(得分:9)

这不起作用的原因是因为只有当表达式的至少一个操作数具有类或枚举类型时,才会触发用户定义的操作符函数的重载解析。

所以你运气不好。这不行。

我认为您可以尝试的最好的方法是等待C ++ 0x编译器,而不是编写3.14,而是编写3.14_myd,作为用户定义的文字。

答案 1 :(得分: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;
}