Außerdem kann mich mir vorstellen, dass man bei der Templatesache höllisch schnell durcheinander kommt, wenn man beispielsweise Iteratoren bastelt, weil ja, soweit ich das verstanden hab, bei gleichem Parametertyp auch die gleiche Instanz weiterverwendet wird.
...
Nein, natürlich nicht. Wo hast du das gelesen?
Zitat von drunken monkey
Kenne mich in C++ nicht damit aus, aber in D hat mich auch gestört, dass man beim Casting-Operator (afaik) nicht den Ziel-Typ mitgeliefert bekommt. o_O Man muss also irgendwas zurückliefern und hoffen, dass das in dem Kontext halbwegs passt.
Oder ich habe was übersehen. ^^"
...
Der Rückgabetyp ist der Typ zu dem du umwandelst. Das hat den Nachteil, dass momentan nur ein opCast pro Klasse/Struktur möglich ist. Das soll sich in Zukunft ändern, soweit ich weiß.
Multiple instantiations of a TemplateDeclaration with the same TemplateArgumentList, before implicit conversions, all will refer to the same instantiation. For example:
...
Jedenfalls hab ich das so interpretiert.
Edit: ah, nicht richtig hingeschaut, das bezieht sich nur auf Aliases.
Der Rückgabetyp ist der Typ zu dem du umwandelst. Das hat den Nachteil, dass momentan nur ein opCast pro Klasse/Struktur möglich ist. Das soll sich in Zukunft ändern, soweit ich weiß.
...
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. :-/
--
A human is a system for converting dust billions of years ago into dust billions of years from now via a roundabout process which involves checking email a lot.
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:
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: