我有代码,我做了很多事情,比如
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”显而易见。但是我喜欢能够无缝使用它并且转换刚刚发生的想法;但只有在真的没有其他选择的时候。
我能做些什么来让我的代码有效吗?
或许我可以使用一些不同的,更高级的魔法来实现我的目标?