2011-04-28 79 views
4

是否有可能超过operator%两个双打?C++过载运算符%两个双打

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 

不幸的是,这也不行!任何提示,想法......都会感激! 在此先感谢, Jonas

+3

嗯......为什么不直接调用'FMOD()'直接和没本事周围操作符重载,它没有必要? – Nim 2011-04-28 11:47:54

回答

9

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

所以你运气不好。这不起作用。

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

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; 
} 
+0

我想过这种方式,但我没有成功:(对于一个小例子我会很高兴!谢谢! – Jonas 2011-04-28 11:39:41

+0

@Jonas更新。 – justin 2011-04-28 11:52:45

+0

好吧,但如果你改变const t_double a(15.3);加倍a = 15.3 ;(对于b而言),那么代码将不会编译,并且在代码中我想使用的不是t_double而是double。 – Jonas 2011-04-28 11:59:15