C++ 类来表示倒数

C++ 类来表示倒数,c++,types,operators,C++,Types,Operators,我有代码,我可以做很多事情,比如 a = 1/((1/b)+(1/c)) 我忍不住,当我可以这样做的时候,我对使用这么多部门感到畏缩 oneOverA = oneOverB + oneOverC 事实上,我几乎可以做每件事的回报。比如说比较 A < B iff oneOverB < oneOverA A

我有代码,我可以做很多事情,比如

a = 1/((1/b)+(1/c))
我忍不住,当我可以这样做的时候,我对使用这么多部门感到畏缩

oneOverA = oneOverB + oneOverC
事实上,我几乎可以做每件事的回报。比如说比较

A < B iff oneOverB < oneOverA
A
无需再分了。等等

然而,这极易出错。想象一下,如果我将反转版本传递给一个期望“直接”版本的函数,或者在比较时忘记反转顺序,等等

但是,C++存在使魔法发生,对吗? 如果我只默示一个非常简单的类头,那么几乎所有的东西都应该优化掉;如果我像编译器一样无误的话,就让它和我写的一样

所以我尝试了一门课,比如

template<typename T = float>  //T must be a type for which 1/T is representable as another T such that 1(1/T)) = T. es. float
class ReversibleNum{
private:
    const T reverse; 
public: 
    ReversibleNum(T orig): reverse(1/orig) {} 
    operator T () { return 1/reverse; }                    
    bool operator < (const ReversibleNum<T>& oth) { return oth.reverse < reverse; } 
    friend T operator / (const T one, const ReversibleNum<T>& two);
}

inline T operator / (const T one, const ReversibleNum<T>& two)  { return one * two.reverse; } 
template//T必须是1/T可以表示为另一个T的类型,这样1(1/T))=T.es。浮动
类可逆枚举{
私人:
常量反转;
公众:
ReversibleNum(T orig):reverse(1/orig){}
运算符T(){return 1/reverse;}
布尔运算符<(const ReversibleNum&oth){return oth.reverse
然而,当我尝试

 ReversibleNum<float> a(5);
 1.0/a
reversiblenuma(5);
1.0/a
它使用“运算符浮点”进行转换,然后进行除法,而不是我想要的“运算符/”

我可能会把“运算符T”显式化。然而,我喜欢的想法是能够使用它seamlessy和有转换刚刚发生;但只有在实在别无选择的时候

我能做些什么使我的代码工作吗


或者我可以使用一些不同的、更高级的魔法来实现我的目标?

你的问题是
1.0
double
而不是
float
。根据您想要的通用性,您可以在两种类型上定义一些模板:
auto operator/(T1 const&one,ReversibleNumconst&two){return one*two.reverse;}
但是可能需要缩小范围以禁用一些您不想要的
T1
情况。谢谢!现在它起作用了。然而,我必须写1.0f/,这很难看。理想情况下,它甚至可以在1/的情况下工作。或者,我可以使用两个独立的模板类型将运算符/声明为。然而,返回类型应该是什么并不明显。我还没有太多地使用
auto
。因此,我认为(但我不确定)如果不需要使用SFINAE来缩小T1的选择范围,返回类型就像我在上面展示的那样简单。如果您确实需要SFINAE,那么返回类型推断将被混合到SFINAE中。我相信我需要SFINAE,但是作为返回类型的“自动”似乎是C++14技巧,我的4.4.7 gcc(我在CentOS上工作)还不支持它。这听起来像是一个访问控制问题。如果是这样的话,它应该很容易解决,而不需要一个编译器版本。尝试
auto操作符/(T1常量和一,ReversibleNumconst和二)->decltype(一*(二)(二)){返回一*二。反向;}