Fehler bei new []?!



  • ok, aber wie kann ich dann dafür sorge tragen, das nenner und zähler trotzdem gekürzt werden?



  • Muss reduce_gcd denn virtual sein?



  • naja, da rational ja eine template-klasse ist schon. den jeder typ kann eine andere methode erfordern den gcd zu entferen. bei long, int, etc. geht der euklidische algorithmus. wenn ich dann aber für t polynome mehrerer variablen einsetze dann brauche ich zB groebner-basen. bei polynomen in einer variable geht polynomdivision, aber das ist nur ein spezialfall von groebner-basen.

    rational soll quasi nur den kern aller rationalen objekte darstellen: zähler, nenner, grundoperationen und halt das man überall kürzen kann, sofern möglich.
    und für die einzelnen typen wird dann spezialisiert.



  • FreakyBKA schrieb:

    naja, da rational ja eine template-klasse ist schon. den jeder typ kann eine andere methode erfordern den gcd zu entferen.

    Gerade bei Templates bist du für solche Dinge nicht an Polymorphie durch Vererbung gebunden.

    Wie wäre es mit einem Policy-Templateparameter?



  • MFK schrieb:

    FreakyBKA schrieb:

    naja, da rational ja eine template-klasse ist schon. den jeder typ kann eine andere methode erfordern den gcd zu entferen.

    Gerade bei Templates bist du für solche Dinge nicht an Polymorphie durch Vererbung gebunden.
    Wie wäre es mit einem Policy-Templateparameter?

    Reicht es nicht völlig, daß gcd ein Template ist?



  • volkard schrieb:

    Reicht es nicht völlig, daß gcd ein Template ist?

    Reichen würden wohl schon ein paar Überladungen einer stinknormalen freien Funktion. Kommt halt drauf an, wieviele Möglichkeiten es da gibt, und ob man die geeignet zusammenfassen kann und ob für manche Typen mehr als eine Möglichkeit der Berechnung geeignet ist und ...



  • was ist unter einem policy-templateparameter zu verstehen? gebe ich da als zweites templateargument, dann eine klasse an die den gcd für zwei objekte des Typs t berechnet oder wie ist das zu verstehen.

    wie meinst du das mit dem gcd als template?



  • FreakyBKA schrieb:

    was ist unter einem policy-templateparameter zu verstehen? gebe ich da als zweites templateargument, dann eine klasse an die den gcd für zwei objekte des Typs t berechnet oder wie ist das zu verstehen.

    Genau so. Für jede Art, den Ggt zu berechnen, baust du ein Klassentemplate mit einer ganz bestimmten Methode, die die Berechnung durchführt. Diese Klassen müssen in keiner Vererbungsbeziehung stehen, die Schnittstelle muss nur "passen". Diese Klasse übergibst du als zweiten Templateparameter, ggf. auch mit einem Defaultwert, falls fast alle Typen dieselbe Methode benutzen, und nur einige wenige etwas anderes.

    FreakyBKA schrieb:

    wie meinst du das mit dem gcd als template?

    Implementiere die Ggt-Berechnung als freies Funktionstemplate, das du dann für bestimmte Templateparameter spezialisierst. Mit ein wenig Templatemetaprogrammierung lassen sich hier vielleicht bestimmte Typgruppen geschickt zusammenfassen.



  • also für template gcd würde das dann ungefähr so aussehen?

    template<class t>
    t gcd(t const &lhs, t const &rhs);
    //...
    
    long gcd<long>(long const &lhs, long const &rhs)
    {
    //euklidischer algorithmus
    }
    
    polynomial gcd<polynomial>(polynomial const &lhs, polynomial const &rhs)
    {
    //groebnerbasen benutzen
    }
    


  • FreakyBKA schrieb:

    also für template gcd würde das dann ungefähr so aussehen?

    Es bringt nicht viel, wenn du für jeden möglichen Typ einzeln spezialisierst. Das gleiche könntest du auch mit gewöhnlicher Überladung erreichen.

    Die Stärke des Template-Ansatzes liegt eher darin, dass du in Abhängigkeit von bestimmten Eigenschaften von t bestimmte Spezialisierungen "einschalten" kannst, Stichworte type_traits, enable_if, SFINAE.


Anmelden zum Antworten