Template Hilfe: array



  • Hallo,

    ich komme einfach nicht weiter.
    Ich habe im Moment ein ganz normales 2D double array welches mit arr2 - arrays gefüllt wird:

    double** arr1;
    double* arr2;

    ich brauche jetzt irgendwie ein template basiertes 2D array um nicht nur double arrays sondern auch complex-wertige eingaben PRO array element zuzulassen.

    D.h. es soll ein und dasselbe template array die eingabe normaler double werte bekommen können, als auch die eingabe pro element von sowas: 2.99 und 5.4
    also 2 double werte die aber untrennbar zueinander gehören.

    Brauche ich dazu evtl. ein struct dass dann als template-typ für ein template-basiertes array genutzt wird?

    Bin im moment total ratlos



  • Im Standardheader <complex> befindet sich ein solcher Typ. Davon kannst du ohne weiteres Arrays anlegen. Wo liegt das Problem?



  • Naja...müsste ich da nicht trotzdem dann 2-fachen code schreiben?

    Also als Beispiel:
    input-file a hat nur double werte - einen pro zeile.

    input-file b hat pro zeile 2 double werte.

    Jetzt will ich abhängig vom input nicht mit if-else verzweigen. Der Grund ist auch dass ich später nicht ständig testen will was für ein typ im array liegt. Sonder halt einfach ein Template...

    oder reden wir gerade aneinander vorbei?



  • Gegenfrage:
    Weißt du überhaupt was ein template macht und was es kann?



  • Ein Template abhängig vom Input? Ne du, das erscheint mir nicht sinnvoll (auch wenn es über Umwege möglich ist, aber auch dann nicht ohne if/else). Templates werden zur Compilezeit ausgewertet, bei der Eingabe (also zur Laufzeit) ist der Zug bereits abgefahren.



  • Hmm....
    also folgendes geht also nicht???:

    der user gibt entweder einen double ein , oder 2 double werte.

    Je nach eingabe wird dieser wert in ein array gespeichert:

    if user input war nur ein double
       Array<double> arr;
       //fülle double in arr
    else
       Array<complex> arr;
       //fülle die 2 double werte in arr
    


  • doch, natürlich geht das - aber so wirst du whs viel Code 2 mal schreiben müssen



  • Hallo

    Zur Laufzeit kannst du sowas mit OOP und Polymorphie machen.
    Du definierst erstmal eine abstakte Basisklasse Value die alle Methoden anbietet die später mit einem Wert erlaubt sein sollen als Interface anbietet. Dann leitest du davon ab so das du je eine Version mit Implementation für double (Double)und std::complex (Complex) bekommst.
    Jetzt kannst du die Eingabe als Factory umsetzen die einmalig je nach Eingabe eine Instanz von Double oder Complex erstellt. Diese kannst du nun in einem Array std::vector<Value*> sammeln und benutzen. Natürlich must du nun selber den Speicher der Werteinstanzen verwalten und must aufpassen das du in einem Durchgang nur gleichartige Values miteinander benutzt.

    bis bald
    akari


Anmelden zum Antworten