可以返回类型混合?或解决方案

时间:2011-05-05 02:30:12

标签: c++ class function return-type

我有一个Fraction类,在自己的院子里工作正常,比如1/2 + 1/3 = 5/6甚至是int,1/2 + 2 = 5/2。

我可以看到3/2 + 3/2 = 3/1但是,有没有办法让一个类型的条件恢复?例如,如果分母为1,则返回int,否则返回Fraction。

如果不可能,还有其他任何绕道吗?

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

非常感谢任何建议!

4 个答案:

答案 0 :(得分:2)

不,在C ++中,不可能让返回类型以您希望的方式依赖于操作数的。无论如何,这将是什么意思,因为那里的下一层代码需要静态地知道结果类型是什么?

现在,如果你的值在编译时都是已知的,那么你可以做一些模板魔术来在编译过程中发生事情,但这似乎不是你想要完成的。

答案 1 :(得分:2)

您无法有条件地更改返回类型。 (如果你有一个超类,你可以有多态性,但这不是你要求的,因为int是一个内在类型。)考虑这种情况:

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

C的类型是什么?编译器必须知道。即使在多态性或类型推断的情况下,在编译时必须有一个确定性的解决方案 关于C的类型。

并且无法知道Fraction在运行时是否代表整数。

答案 2 :(得分:0)

一个可能的(运行时)解决方案是将隐式转换运算符设置为int,断言你的分数是x / 1.

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

它允许您将Fraction传递给整数并在运行时检查它是否正确。 不是你想要的,但这是你能拥有的最好的。

答案 3 :(得分:0)

可能的解决方案是合并std::pairboost::optional

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