G
...: Mein OOP-Stolz.
So, ein herzliches Dankeschön an alle Helfer und Helfershelfer, denn es geht. Im Grunde habe ich einfach campers und .filmors Varianten zusammengeworfen und eine wenigstens einigermaßen elegante eigene Variante daraus zusammengebastelt:
//helper enum
enum enabled_method
{
all,
quadratic,
quadratic_2,
quadratic_3,
quadratic_4
};
template <typename T, int m, int n>
class basic_matrix
{
//...
template <enabled_method e>
typename boost::enable_if_c<
e==quadratic || e==quadratic_2 || e==quadratic_3 || e == quadratic_4>::type
do_transpose();
public:
void transpose()
{
do_transpose<
m==n?
(m==2?quadratic_2:
(m==3?quadratic_3:
(m==4?quadratic_4:
quadratic))):
all
>();
}
//...
};
Wird zwar wieder etwas Redundanz für all diese Unterscheidungsmethoden, aber naja, jetzt bin ich den Umweg gegangen, da werde ich ihn nicht zurückgehen, nur weil ein anderer Weg vielleicht noch kürzer ist. Wenigstens gibt es schöne, aussagekräftige Fehlermeldungen:
matrix.hpp: In member function »void rayce::basic_matrix<T, m, n>::transpose() [with T = double, int m = 4, int n = 5]«:
main.cpp:37: instantiated from here
matrix.hpp:92: Fehler: keine passende Funktion für Aufruf von »rayce::basic_matrix<double, 4, 5>::do_transpose()«
geloescht
Edit: Verbesserung und Fehlermeldung