Templates + Factory



  • Ich möchte gerne Butcher-Tableaus für Löser gewöhnlicher Differetialgleichungen in meinem Programm erzeugen.

    Diese Tableaus bestehen im Grunde aus einer Matrix und zwei Vektoren und wurden von mir ungefähr so umgesetzt:

    template <typename M, typename V>
    class ButcherTable
    {
    public:
      M A;
      V b,c;
      int order;
      int s;
    }
    

    Idee war, dass ich Matrix, bzw Vektortypen austauschbar halte. Die einzige Anforderung,die ich stelle, ist dass Feldzugriffe möglich sein sollten. Also so etwas wie: A[0][0]

    Nun soll der Nutzer zu Programmstart ein Tableau auswählen können, z.B. Radau IA dritter Ordnung.

    An dieser Stelle wollte ich eine Factory nutzen, die nach einem Namen sucht und ein Tableau zurückgibt:

    ButcherTable<std::vector<std::vector<double>, std::vector<double>
    FactoryMethod(std::string name)
    {
      if(name == "RadauIA3")
      {
          <std::vector<std::vector<double>> a(2,std::vector<double>(2));
          a[0][0] = 1./4.;
          ...
          ButcherTable<std::vector<std::vector<double>, std::vector<double> table;
          table.A = a;
          return table;
      }
    }
    

    Soweit geht das ganze gut. Nun wurde ich darauf hingewiesen, dass jemand statt std::vector gerne std::array verwenden will, da die Tableaus ja sehr klein sind und feste Größen haben.

    Ich könnte RadauIA3 nach meinem bisherigen Schema darstellen als:

    ButcherTable<std::array<std::array<double,2>,2>, std::array<double,2>> RadauIA3;
    

    Allerdings sehe ich dann keine Möglichkeit mehr, eine Factory zu nutzen, da der Rückgabetyp nun von der Anzahl der Stufen abhängt.

    Deswegen:
    Habe ich hier grobe Designfehler drin? Was kann ich besser machen?
    Kann mir jemand für dieses Problem vielleicht eine Lösung präsentieren?


Log in to reply