D是否有“newtype”(如Haskell中的)。
这是一个天真的问题,因为我只是略读D,但是Google没有找到任何有用的东西。
在Haskell中,这是一种在编译时区分同一事物的不同类型的方法,但不会导致任何运行时性能损失。
例如,你可以为米、秒和公斤制造新的类型(双打)。如果你的程序将一个以米为单位的数量加到一个以秒为单位的数量上,这将在编译时出错,但在运行时会像两个都是双精度的一样快(它们在运行时是双精度的)。
如果D没有类似于“newtype”的东西,那么处理尺寸量的公认方法是什么?
谢谢,
克里斯。
发布于 2010-08-27 00:29:38
在D1.0中有typing,它是从预定义类型到“newtype.”的强类型。
D2.0已经删除了这一点,只保留了别名(在C中的this是什么)。有关于包装模板的讨论,可以强烈地创建一个新的类型。
typedef的问题是,有很好的理由让newtype成为预定义类型的子类型,也有很好的理由让它成为超类型。
types的语义是将基类型隐式转换为newtype,但不会将newtype转换为基类型或具有相同基类型的其他类型。我在这里使用基类型,因为:
typedef int Fish;
typedef Fish Cat;
Fish gold = 1;
Cat fluff = gold;将无法编译。
到目前为止,2.048 DMD仍然允许使用typedef (但不要使用它)。
将基类型转换为newtype非常有用,这样您就不必编写
meters = cast(meters) 12.7;发布于 2010-08-27 02:11:15
有趣的是,正如he_the_great提到的,D1有一个强大的typedef,但没有人使用它,可能是因为不可能为每种情况定制确切的语义。处理这种情况的最简单方法可能是在Phobos中的某个地方包含一个mixin模板,该模板允许您转发所有运算符,但具有通过mixin自动生成的模板来完成此操作。然后,您只需创建一个包装器结构并完成所有设置即可。
https://stackoverflow.com/questions/3576580
复制相似问题