Seite 2 von 2 ErsteErste 12
Ergebnis 21 bis 21 von 21

Thema: Let's D

  1. #21
    Zitat Zitat von drunken monkey Beitrag anzeigen
    Genau das meinte ich. Der Rückgabetyp ist klar, es ist aber nicht möglich, herauszufinden, zu welchem Typ gecastet werden sollte. Also muss man schon vorher wissen, zu welchem Typ die Leute ein Objekt der Klasse am ehesten casten wollen könnten. Unpraktisch. :-/
    Ich glaube ich muss es noch etwas detaillierter erklären.
    Zum einen wird opCast nur bei expliziten Casts angewandt, d.h. bei Ausdrücken der Form cast(typ)variable.
    Zum anderen finden bei solchen Ausdrücken bis zu zwei Casts nacheinander statt, nämlich der explizite Cast durch opCast (falls definiert), und anschließend der implizite Cast vom Typ des vorherigen Casts zum Typ, der im Ausdruck steht (falls nicht sowieso schon identisch und falls ein impliziter Cast überhaupt möglich ist). Dabei ist nicht etwa wichtig, dass opCast genau zu dem Typ castet, der im Ausdruck steht, sondern, dass es zu einem Typ castet, der - falls nötig - implizit zu dem Typ gecastet wird, der im Ausdruck steht.
    Damit man es sich besser vorstellen kann, hier ein Musterbeispiel für opCast:
    Code (D):
     
    class Circle {
      // ...
    }
     
    class Integer {
        this() {
        }
     
        this(int val) {
            value = val;
        }
     
        int opCast() {
            return value;
        }
     
        private int value;
    }
     
    void main() {
        auto a = new Integer(123);
        auto b = cast(int)a; // ok, explizit von Integer nach int
        auto c = cast(long)a; // ok, explizit von Integer nach int 
                              // und implizit von int nach long
        auto d = cast(Circle)a; // fehler, explizit von Integer nach int möglich,
                                // aber implizit von int nach Circle unmöglich!
    }
     

    Wie man sieht, reicht es absolut aus, mit opCast zu einem festen Typ zu casten, der dann dennoch implizit zu jedem numerischen Basistyp gecastet werden kann.

    Auch sollte man anmerken, dass ein Cast Sinn machen muss. Es wäre sowohl unsinnig explizit von Integer nach Circle innerhalb von opCast zu casten (obwohl es durchaus möglich ist), als auch implizit von int nach Circle, da die Typen untereinander logisch unverträglich sind.

    Ansonsten: Wie bereits geschrieben, könnte opCast zukünftig überladbar werden.


    Edit: @DFYX:

    Da du Iteratoren angesprochen hast: In D sind Iteratoren, entgegen der C++ STL, eher unüblich. In der Regel werden Ranges verwendet. Folgendes wäre für dich also vielleicht von Interesse:

    ForEach
    ForEachRange
    std.range

    Geändert von Kyuu (29.09.2009 um 09:07 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •