D有'newtype'吗?

fad*_*bee 9 haskell types type-systems d

D是否具有'newtype'(如在Haskell中).

这是一个天真的问题,因为我只是在浏览D,但谷歌没有发现任何有用的东西.

在Haskell中,这是一种在编译时使不同类型的相同事物不同的方法,但不会导致任何运行时性能损失.

例如,你可以制作米,秒和千克的新类型(双打).如果您的程序以米为单位以数秒为单位添加数量,那么在编译时会出现错误,但在运行时也会像两个都是双精度(它们在运行时)一样快.

如果D没有类似'newtype'的东西,那么处理尺寸数量的方法有哪些?

谢谢,

克里斯.

he_*_*eat 12

在D1.0中有typedef,它是从预定义类型到'newtype'的强类型.

D2.0删除了这个,只剩下别名(C中的typedef).有人谈论有一个可以强大创建新类型的包装器模板.

typedef的问题在于,有一个很好的参数可以使newtype成为预定义类型的子类型,也是使其成为超类型的好参数.

typedef的语义是基类型被隐式转换为newtype,但newtype不会转换为基类型或具有相同基类型的其他类型.我在这里使用基类型:

typedef int Fish;
typedef Fish Cat;
Fish gold = 1;
Cat fluff = gold;
Run Code Online (Sandbox Code Playgroud)

将无法编译.

目前,2.048 DMD仍允许使用typedef(但不要使用它).

将基类型转换为newtype非常有用,因此您无需编写

meters = cast(meters) 12.7;
Run Code Online (Sandbox Code Playgroud)


dsi*_*cha 6

有趣的是,正如他提到的那样,D1有一个强大typedef但没有人使用它,可能是因为无法为每个案例定制确切的语义.处理这种情况的最简单方法,至少对于原始类型,可能是在Phobos中的某处包含一个mixin模板,它允许您转发所有运算符,但具有通过mixin自动生成的样板.然后你只需创建一个包装器结构并完成所有设置.