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

发布于 2024-11-03 20:10:58 字数 889 浏览 6 评论 0原文

是否可以为两个双精度重载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

不幸的是,这不起作用!任何提示、想法……都将受到赞赏! 提前致谢, 乔纳斯

is it possible to overload the operator% for two doubles?

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

Of course, this generates an error because one of the two parameters must have a class type.
So I thought about utilizing the possibility of implicit constructor calls of C++ to get around of this problem. I did it in the following way:

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());
}

... and:

double a = 15.3;
double b = 6.7;

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

Unfortunately, this does not work! Any hints, ideas, ... are appreciated!
Thanks in advance,
Jonas

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暮年 2024-11-10 20:10:58

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

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

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

The reason this doesn't work is because overload resolution for user defined operator functions is only triggered if at least one operand of the expression has a class or enumeration type.

So you are out of luck. This won't work.

I think the best you could try is waiting for a C++0x compiler and instead of writing 3.14, you write 3.14_myd, as a user defined literal.

囚我心虐我身 2024-11-10 20:10:58

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

alternatively, implement double MyDouble::operator%(const double&) const;, like so:

#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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文