2011-04-28 81 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