Проблема перегрузки оператора преобразования языка D - PullRequest
2 голосов
/ 21 июня 2011

Я сейчас играю с D2, я хотел бы написать какую-нибудь простую программу, но я застрял с перегрузкой приведения оператора ... У меня есть класс Vector, который можно привести к Normal:

class Vector {
    public float x,y,z; 
    this(in float x, in float y, in float z){
        this.x = x;
        this.y = y;
        this.z = z;
    }

    //..............

    Normal opCast(T)() if (is(T == Normal)){
        return new Normal(this.x,this.y,this.z);
    }
}

Если я пишу что-то вроде

immutable Vector v = cast(immutable(Vector))new Vector(0F, 0F, 0F);

, компилятор жалуется, что:
"экземпляр шаблона opCast! (Immutable (Vector)) не соответствует объявлению шаблона opCast (T) if (is (is (T == Normal)) "

Если я опускаю приведение:

immutable Vector v = new Vector(0F,0F,0F);

сообщение изменяется, но программа не компилируется:
" не может неявно преобразовать выражение(новый Vector (0F, 0F, 0F)) типа Vector to immutable (Vector) "

Если я опускаю перегрузку оператора приведения в классе Vector, все компилируется просто отлично.

Поместить по-другому ... Как я могу назначить или привести экземпляр к неизменному 'var'?

Ответы [ 2 ]

1 голос
/ 21 июня 2011

обычно не следует перегружать opCast.

обычно методы с именем toTypename используются для объекта, который знает, как преобразовать себя в другой.

Normal toNormal () { return new Normal (x, y, z); }
0 голосов
/ 21 июня 2011

У вас есть два решения:

  • Хорошее решение - это то, что Trass3r уже упомянул в своем комментарии: трактуйте immmutable(Vector) как свой собственный тип данных (он есть) и вызывайте его конструктор.

  • Несколько более уродливое решение - использовать assumeUnique() на объекте, который вы хотите наложить.Я думаю, вам может понадобиться импортировать библиотеку (std.exception, если я не ошибаюсь).

...