能不能回式混?或者变通的解决方案

can return type mix? or workaround solution

本文关键字:解决方案 或者 能不能      更新时间:2023-10-16

我有一个分数类,在自己的院子里工作得很好,像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;
}

非常感谢您的建议!

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

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

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

并且直到运行时才知道Fraction是否表示整数

不,在c++中不可能以您希望的方式让返回类型依赖于操作数的。既然从那里输出的下一层代码需要静态地知道结果类型是什么,那么这有什么意义呢?

现在,如果您的值在编译时都是已知的,那么您可以执行一些模板魔术来使事情在编译期间发生,但这似乎不是您想要完成的。

一个可能的(运行时)解决方案是使用隐式的int转换运算符来断言您的分数是x/1。

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

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

一个可能的解决方案是合并std::pair和boost::optional。

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