2011-05-05 16 views
1

我有一個分數類,可以在自己的碼裏工作,比如1/2 + 1/3 = 5/6甚至是int,1/2 + 2 = 5/2。可以返回類型混合?或變通辦法解決方案

對我來說,看到3/2 + 3/2 = 3/1是可以的,但是,有沒有辦法返回一個有條件的類型?例如,如果分母是1,則返回一個int,否則返回一個分數。

如果不行,還有其他繞行嗎?

class Fraction{ 
__int64 _num,_dem; 
public: 
    friend Fraction const operator+(Fraction const& lhs,Fraction const& rhs); 
} 

Fraction const operator+(Fraction const& lhs,Fraction const& rhs){ 
    return Fraction(lhs)+=rhs; 
} 

非常感謝您的任何建議!

回答

2

您不能有條件地更改返回類型。 (你可以有多態性,如果你有一個超類,但是這不是你問這裏,因爲int是一種內在的類型。)考慮這種情況下:

Fraction A, B; 
// initialize to 3/2 and 3/2 
sometype C = A + B; 

什麼是C的類型?編譯器必須知道。即使在多態性或類型推斷的情況下,關於C的類型,在編譯時間處必須存在確定性解決方案

而且沒有辦法知道Fraction代表一個整數,直到運行時。

2

不,在C++中無法以您希望的方式使返回類型取決於操作數的。無論如何,無論如何會有什麼意義,因爲下一層代碼需要靜態地知道結果類型是什麼?

現在,如果您的值在編譯時已知,您可以在編譯期間做一些模板魔術來使事情發生,但這似乎並不是您想要完成的。

0

可能的(運行時)解決方案是將隱式轉換運算符轉換爲int,表明您的分數爲x/1。

class Fraction 
{ 
    operator __int64() const 
    { 
     assert(den == 1); 
     return num; 
    } 
} 

它將允許您將Fraction傳遞給整數,並在運行時檢查它是否正確。 也許不是你真正想要的,但這是最好的你可以擁有。

0

可能的解決方案是std::pairboost::optional的合併。

std::pair< boost::optional<Fraction>, boost::optional<int> > const operator+(Fraction const& lhs,Fraction const& rhs);