Fehler bei new []?!



  • 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