D语言转换操作符过载问题

时间:2011-06-20 20:27:57

标签: operator-overloading immutability d

我现在正在玩D2,我想编写一些简单的程序,但我遇到了操作员强制重载...我有一个可以强制转换为Normal的Vector类:

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(T == Normal))”

如果我省略演员:

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

消息发生变化,但程序无法编译:
“不能将Vector类型的表达式(新Vector(0F,0F,0F))隐式转换为不可变(Vector)”

如果我在Vector类中省略了cast运算符重载,那么所有编译都很好。

以不同的方式...如何将实例分配或转换为不可变的'var'?

2 个答案:

答案 0 :(得分:1)

你不应该正常超载opCast

通常名为 toTypename 的方法用于知道如何将自身转换为另一个的对象。

Normal toNormal () { return new Normal (x, y, z); }

答案 1 :(得分:0)

您有两种解决方案:

  • 一个漂亮的解决方案是Trass3r在他的评论中已经提到的:将immmutable(Vector)视为自己的数据类型(它是),并调用其构造函数。

  • 一个更丑陋的解决方案是对要投射的对象使用assumeUnique()。我想你可能需要导入一个库(std.exception,如果我没错的话)。