Arithmetische Operationen in Generics mit Typ-Objekten.



  • Gegrüßet seid ihr!
    Ich versuche mir derzeit C# anzueignen (komme von C++) und habe gerade das Problem, dass ich meine Generic-Matrix-Klasse erstmal so nicht implementieren kann, wie ich das in C++ gewöhnt war.

    Und zwar habe ich bei dem Multiplikationsoperator bei folgendem Ausruck Probleme:

    public static Matrix<T> operator*( Matrix<T> a, Matrix<T> b )
    {
       // ...
                     result[x, y] += a[z, y] * b[x, z];
       // ...
    }
    

    a und b sind vom Typ Matrix<T>, somit ergibt der [] operator ein T-Objekt. Allerdings besitzen ja nun längst nicht alle möglichen T's einen * Operator. Ich habe geschaut, ob die eingebauten Werttypen eventuell eine Schnittstelle für arithmetische Operationen besitzen, allerdings nix gefunden. Ansonsten hätte ich einfach den Generic-Parameter auf IArithmetic oder so eingeschränkt.

    Wie bekomme ich es hin, dass man für den Generic-Parameter nur Typen mit den arithmetischen Operationen angeben kann, so dass es automatisch für die eingebauten Typen funktioniert?

    Viele Grüße,
    deci



  • Kurze Antwort: dies geht in C# nicht, da Generics schon beim Parsen typenbezogen sind (und nicht wie die Templates in C++ erst bei der Instantiierung).

    Etwas längere Antwort:
    du müßtest, wie du schon geschrieben hast, alles auf ein Interface umstellen. Nachteil ist, daß man dort keine Operatoren angeben kann, sondern nur Methoden. Und dann müßtest du für alle Basistypen jeweils eigene Klassen erzeugen, welche von diesem Interface erben - und dann entsprechende Konvertierungsoperatoren mittels 'explicit' bzw. 'implicit' zur Verfügung stellen.
    Alles in allem, eher Krampf...

    Unter http://www.codeproject.com/KB/cs/genericnumerics.aspx gibt es aber einen entsprechenden Ansatz.

    Und unter http://www.ohloh.net/p/matrixMath scheint es eine generische Matrix-Klasse zu geben (diese habe ich mir aber noch nicht angesehen).



  • Danke für Deine ausführliche Antwort, werde mir die beiden Seiten direkt mal anschauen.
    Wie es mir scheint, habe ich ja direkt mit der richtigen Sache angefangen, hehe.

    Viele Grüße,
    Deci


  • Administrator

    In C# 4.0 gäbe es noch die Möglichkeit dynamic zu verwenden.

    public static Matrix<T> operator*(Matrix<T> a, Matrix<T> b)
    {
      // ...
      dynamic lhs = a[z, y];
      dynamic rhs = b[x, z];
      result[x, y] += lhs * rhs;
      // ...
    }
    

    Man sollte sich allerdings durchaus ein paar Fragen im Hintergrund behalten, was die Performance anbelangt, da erst zur Laufzeit geprüft wird, ob diese Operationen möglich sind. Wie gut die CLR dies optimieren kann, ist mir nicht bekannt. Auch beherbergt es natürlich die Gefahr, dass Kompilerfehler in Laufzeitfehler umgewandelt werden.

    Grüssli


Anmelden zum Antworten