I don’t know why it didn’t dawn on me that this would work. After all, it’s not like I’ve been using C++ for the past 18-mumble-years. (Oh, wait; I have. Meh.)
So we define a class AClass, BClass and CClass such that AClass has an operator that converts it to BClass and CClass, and BClass has an operator that converts it to CClass. (Call AClass “integer”, BClass “double” and CClass “std::complex”.)
If we then define three operator + implementations:
AClass operator + (const AClass &a, const AClass &b); BClass operator + (const BClass &a, const BClass &b); CClass operator + (const CClass &a, const CClass &b);
Then we get automatic promotion to the appropriate type (AClass, BClass or CClass), regardless of what mixture of classes we use. Thus:
AClass a(5); BClass b(3.3); CClass c = a + b;
will set c = 8.3 + 0i.
I mean, this behavior makes complete sense. I just never thought of using this feature for my own code, until now.