用于表示倒数的类

时间:2015-12-15 11:52:18

标签: c++ types operators

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

a = 1/((1/b)+(1/c))

我无法帮助它,当我能够像这样做时,我会畏缩使用这么多的部门

oneOverA = oneOverB + oneOverC

事实上,我可以用倒数做几乎所有事情。比如用比较

A < B iff oneOverB < oneOverA

再次无需分裂。等等。

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

但是,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; } 

然而,当我尝试

 ReversibleNum<float> a(5);
 1.0/a

它使用“operator float”来转换然后除以,而不是“operator /”这就是我想要的。

我可能会让“操作员T”显而易见。但是我喜欢能够无缝使用它并且转换刚刚发生的想法;但只有在真的没有其他选择的时候。

我能做些什么来让我的代码有效吗?

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

0 个答案:

没有答案