C ++ оператор перегрузки% для двух двойных - PullRequest
4 голосов
/ 28 апреля 2011

возможно ли перегрузить operator% для двух значений типа double?

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 ]

9 голосов
/ 28 апреля 2011

Причина, по которой это не работает, заключается в том, что разрешение перегрузки для пользовательских функций оператора запускается только в том случае, если хотя бы один операнд выражения имеет класс или тип перечисления.

Так что вам не повезло. Это не сработает.

Я думаю, что лучшее, что вы можете попробовать - это ждать компилятора C ++ 0x, и вместо написания 3.14 вы пишете 3.14_myd как пользовательский литерал.

0 голосов
/ 28 апреля 2011

альтернативно, реализовать 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;
}
...