【问题标题】:D language cast operator overload problemD语言强制转换运算符重载问题
【发布时间】:2011-06-20 20:27:56
【问题描述】:

我现在正在玩 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 类型的表达式 (new Vector(0F,0F,0F)) 隐式转换为不可变(Vector)"

如果我在 Vector 类中省略强制转换运算符重载,则所有编译都很好。

换一种方式...如何将实例分配或强制转换为不可变的“var”?

【问题讨论】:

  • 我认为你应该能够做到'auto v = new immutable(Vector)(0f,0f,0f);'
  • “类向量”是一个非常糟糕的主意。我向您保证,您不想为您执行的每个向量操作强制分配内存。请改用“结构向量”。

标签: operator-overloading immutability d


【解决方案1】:

你不应该正常超载opCast

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

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

【讨论】:

    【解决方案2】:

    您有两种解决方案:

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

    • 一个更难看的解决方案是在要投射的对象上使用assumeUnique()。我认为您可能需要导入一个库(std.exception,如果我没记错的话)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多