Exponent operator overloading Saturday 2nd January 2010
In C++ you can’t create new operators to overload, you can only overload the operators that are already defined in the language. Often, an exponentiation operator is cited as an example of a new operator that you might want to have, so something like this isn’t possible.
#include <cmath> #include <cassert> int main() { Double d1 = 81.0; Double d2 = 0.5; Double d3 = 4.0; Double d4 = 3.0; assert( d1 * d2 == 40.5 ); assert( d1 ** d2 == 9.0 ); assert( d4 ** d3 == d1 ); assert( d4 * d3 == 12.0 ); return 0; }
(Excuse the use of ==
with floating point, in this toy example all the numbers have exact representations.)
Or is it?
Actually, it is. By suitable abuse of the prefix version of *
and a simple proxy class we can get the effect of a **
operator although you might not always get the precedence that you expect.
#include <cmath> template<class T> struct Exponent { explicit Exponent(T t) : val(t) { } T val; }; template<class T> class Number { public: Number(T t) : val(t) { } Exponent<T> operator*() const { return Exponent<T>(val); } Number operator*(const Exponent<T>& e) const { return Number(std::pow(val, e.val)); } operator T() const { return val; } private: T val; }; typedef Number<double> Double;
Neat, if evil.
Convert to exponent, then apply exponent. It kind of makes sense.
I vote for more operator overloading evil.