C++ 可以退货吗?或变通解决方案
我有一个分数类,在它自己的院子里工作得很好,比如1/2+1/3=5/6,甚至是int,1/2+2=5/2 我可以看到3/2+3/2=3/1,但是,有没有方法返回一个类型?例如,如果分母为1,则返回int,否则返回分数 如果不可能,还有其他绕道吗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)
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);