On Wednesday, 26 June 2013 at 07:35:08 UTC, Namespace wrote:
On Tuesday, 25 June 2013 at 23:39:45 UTC, Ali Çehreli wrote:
With apologies, I have unrelated comments to make.

On 06/25/2013 03:07 PM, Namespace wrote:

>     this(T x, T y) {
>         this.x = x;
>         this.y = y;
>
>         points ~= &this._point;

I have seen similar designs in the past where constructors had side-effects such as registering the object in a global state. (Exactly what the last line is doing above.)

It has almost always been cause of trouble. It is better to register an object from the outside after constructing it.

Sometimes I had attempted to remove seemingly unused objects only to be reminded by a comment that it should not be:

   // Do not remove! Registers itself in the points array
   auto p = Point();

>     @property
>     inout(Point)* ptr() inout {
>         points[this.id].x = cast(int) this.x;
>         points[this.id].y = cast(int) this.y;

That looks questionable as well: ptr() looks like an accessor but it makes changes to a global state.

Ali

This is no real code. Just a test example to check. ;)

It seems safe, however, your example seems to show how to indeed break the type system... without a cast (!):

    @property
    Point* ptr() inout {
        points[this.id].x = cast(int) this.x;
        points[this.id].y = cast(int) this.y;

        return points[this.id];
    }


void main() {
    immutable TplPoint!float my = TplPoint!float(42, 23);
    Point* p = my.ptr; //Oops! mutable point!
}

Disturbing...

    this(T x, T y) {
        this.x = x;
        this.y = y;

        points ~= &this._point;

I'd careful with this, you can easily end up with pointers to destroyed temporaries...

Reply via email to