My 5 cents.
I intuitively knew I need to do lots of boilerplate code.
This is why, instead of operator [], I did overloaded operator (int, int). Then in final result, instead of m[1][2], I did m(1,2)
I know it is DIFFERENT thing, but is still very intuitive and looks like mathematical script.