C++ 可以退货吗?或变通解决方案

C++ 可以退货吗?或变通解决方案,c++,class,function,return-type,C++,Class,Function,Return Type,我有一个分数类,在它自己的院子里工作得很好,比如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)

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

谢谢你的建议

>不,C++中不可能让返回类型依赖于操作数的值。既然从那里出来的下一层代码需要静态地知道结果类型是什么,那么重点是什么呢


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

< P>不,C++中不可能以你希望的方式来依赖返回值的操作数。既然从那里出来的下一层代码需要静态地知道结果类型是什么,那么重点是什么呢


现在,如果您的值在编译时都是已知的,那么您可以在编译过程中使用一些模板魔法来实现,但这似乎不是您想要实现的。

您不能有条件地更改返回类型。(如果你有一个超级类,你可以有多态性,但这不是你在这里要求的,因为<代码> INT/COM>是一个内在的类型。)考虑这个例子:

Fraction A, B;
//  initialize to 3/2 and 3/2
sometype C = A + B;
C的类型是什么?编译器必须知道。即使在多态性或类型推断的情况下,对于C的类型,在编译时也必须有一个确定性的解决方案


直到运行时,才知道分数是否代表整数。

您不能有条件地更改返回类型。(如果你有一个超级类,你可以有多态性,但这不是你在这里要求的,因为<代码> INT/COM>是一个内在的类型。)考虑这个例子:

Fraction A, B;
//  initialize to 3/2 and 3/2
sometype C = A + B;
C的类型是什么?编译器必须知道。即使在多态性或类型推断的情况下,对于C的类型,在编译时也必须有一个确定性的解决方案

直到运行时,才知道分数是否代表整数。

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

class Fraction
{
   operator __int64() const
   {
      assert(den == 1);
      return num;
   }
}
它将允许您将分数传递给整数,并在运行时检查它是否正确。 这可能不是你想要的,但这是你能得到的最好的解决方案。

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

class Fraction
{
   operator __int64() const
   {
      assert(den == 1);
      return num;
   }
}
它将允许您将分数传递给整数,并在运行时检查它是否正确。
也许不是你想要的,但这是你能得到的最好的。一个可能的解决方案是合并和

std::pairconst操作符+(分数常量和lhs,分数常量和rhs);

一个可能的解决方案是合并和

std::pairconst操作符+(分数常量和lhs,分数常量和rhs);