2011-05-05 17 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);