我在 Fortran 2003 中编写了一些代码,这些代码用稀疏矩阵做了很多线性代数。我正在尝试利用新标准的一些更抽象的特性,这样我就有了更简单的程序,而没有太多重复的代码。
我有一个过程solver,它接受一个矩阵、一些向量、所使用的迭代方法的容差等。我将一个指针传递给一个调用matvec它的过程;matvec是我们用于矩阵向量乘法的子程序。
问题是,有时一个过程会在发送到该过程的通常matvec参数之上接受额外的参数。colorlist, color1, color2我可以想到几种处理方法。
第一个想法:定义两个不同的抽象接口matvec1和matvec2两个不同的求解器。这可行,但这意味着复制一些代码,这正是我试图避免的。
另一个想法:保持相同的抽象接口matvec,并使额外的参数colorlist, color1,color2可选。这意味着在每个 matvec 例程中使它们成为可选的——即使是那些它们不是真正可选的,以及它们甚至根本不使用的例程。如果我这样做,我肯定会下地狱的。
我能想到很多其他不是最佳的解决方案。我想对此提出一些意见——我确信有一些优雅的方法可以做到这一点,我只是不确定它是什么。