繁体   English   中英

C++ 两个双打的重载 operator%

[英]C++ Overload operator% for two doubles

是否可以为两个双打重载operator%

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

当然,这会产生错误,因为两个参数之一必须具有 class 类型。 所以我考虑利用隐式构造函数调用 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

不幸的是,这不起作用,任何提示,想法。 ..,不胜感激! 在此先感谢,乔纳斯

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

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

我认为您可以尝试的最好的方法是等待 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM