我有一个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;
}
非常感谢任何建议!
答案 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::pair和boost::optional。
std::pair< boost::optional<Fraction>, boost::optional<int> > const operator+(Fraction const& lhs,Fraction const& rhs);