用于两个double的重载操作符%

C++ Overload operator% for two doubles

本文关键字:重载 操作符 double 两个 用于      更新时间:2023-10-16

是否有可能超载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

不幸的是,这不起作用!任何提示,想法,…是欣赏!提前感谢,乔纳斯

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

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

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

或者实现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;
}