Ich schreibe etwas Code in Fortran 2003, der viel lineare Algebra mit dünn besetzten Matrizen tut. Ich versuche, einige der abstrakteren Merkmale des neuen Standards auszunutzen, also habe ich einfachere Programme ohne zu viel wiederholten Code.Laufzeit-Polymorphie in Fortran 2003
Ich habe eine Prozedur solver
, die in einer Matrix, einige Vektoren, die Toleranz für die iterative Methode verwendet usw. Ich gebe einen Zeiger auf eine Prozedur namens matvec
zu ihm; matvec
ist die Subroutine, die wir für Matrix-Vektor-Multiplikationen verwenden.
Das Problem ist, manchmal matvec
ist ein Verfahren, das zusätzliche Argumente colorlist, color1, color2
über die üblichen an dieses Verfahren gesendet. Ich kann mir verschiedene Möglichkeiten vorstellen, damit umzugehen.
Erste Idee: Definieren Sie zwei verschiedene abstrakte Schnittstellen matvec1
, matvec2
und zwei verschiedene Löser. Das funktioniert, aber es bedeutet, einen Code zu duplizieren, was ich gerade vermeiden möchte.
Eine andere Idee: Halten Sie die gleiche abstrakte Schnittstelle matvec
, und machen die zusätzlichen Argumente , color1
, color2
optional. Das bedeutet, dass sie in jeder Matvec-Routine optional sind - sogar für solche, für die sie nicht wirklich optional sind, und für Routinen, in denen sie überhaupt nicht verwendet werden. Ziemlich sicher, dass ich zur Hölle fahren werde, wenn ich das tue.
Ich kann an viele andere weniger als optimale Lösungen denken. Ich hätte gerne etwas dazu - ich bin mir sicher, dass es eine elegante Möglichkeit gibt, es zu tun, ich bin mir nur nicht sicher, was es ist.