I come from a C background and I'm now learning OOP with C++. As an exercise (so please don't just say "this already exists"), I want to implement a wrapper for BLAS that will let the user write matrix algebra in an intuitive way (e.g. similar to MATLAB) e.g.:
A = B*C*D.Inverse() + E.Transpose();
My problem is how to go about dealing with real (R) and complex (C) matrices, because of C++'s "curse" of letting you do the same thing in N different ways.
I do have a clear idea of what it should look like to the user: s/he should be able to define the two separately, but operations would return a type depending on the types of the operands (R*R = R, C*C = C, R*C = C*R = C). Additionally R can be cast into C and vice versa (just by setting the imaginary parts to 0).
I have considered the following options:
As a real number is a special case of a complex number, inherit
RMatrix. I quickly dismissed this as the two would have to return different types for the same getter function.
Matrix. However, I can't really think of any common code that would go into
Matrix(because of the different return types).
Matrix<T>and declare the getter function as
T Get(int i, int j), and operator functions as
Matrix *(Matrix RHS). Then specialize
Matrix<complex>, and overload the functions.
Then I couldn't really see what I would gain with templates, so why not just define
CMatrixseparately from each other, and then overload functions as necessary?
Although this last option makes sense to me, there's an annoying voice inside my head saying this is not elegant, because the two are clearly related. Perhaps I'm missing an appropriate design pattern?
So I guess what I'm looking for is either absolution for doing this, or advice on how to do better.