如何获取泛型类型的默认值?

Dmi*_*ruk 12 d

我正在使用D语言,并希望获得泛型类型的默认值,类似于default(T)在C#中的工作方式.这可能吗?如果不是 - 可能的解决方法是什么?

小智 12

我想T.init可能就是你要找的东西.


Jon*_*vis 12

D中的每个类型都有一个默认值.它可以通过类型的init属性访问.int.init,float.init,Object.init,等.在模板类型的情况下,它仍然是init财产.例如,如果你有泛型类型T,那就是T.init.

init通常最接近该类型具有的错误值.对于整数类型,它是0.因为bool,是的false.对于浮点类型,它是NaN.对于角色类型,它是\u00FF.对于引用(即类)和指针,它是null.就结构而言,它的成员变量直接初始化的价值就是它.例如,在

struct S
{
    int a = 17;
    bool b;
}
Run Code Online (Sandbox Code Playgroud)

S.init是的实例S,其a17bfalse.特别值得注意的是,对init属性的需求是D中的结构不能具有默认构造函数的原因.它们的默认状态 - 也就是它们的init属性 - 必须在编译时知道,而构造函数将在运行时运行,因此不能使用构造函数创建结构的默认值,因此,虽然结构可以有构造函数,他们不能有默认的构造函数.

对于枚举,init属性取决于它的枚举类型.一个明显的常数,如

enum i = 7;
Run Code Online (Sandbox Code Playgroud)

将具有init与其类型相同的属性(int在本例中),因为您没有真正创建新类型.但是,对于实际创建新类型的枚举,例如

枚举E {a = 7,b = 17};

默认值是枚举中的第一个值.在这种情况下,E.init将是a.

数组是它有点有趣的地方.init动态数组和关联数组的属性是null.但是,为数组分配内存(无论是静态还是动态)时,每个元素都会初始化为其类型的init属性.因此,对于数组,您既有init价值又有init元素价值.

在任何情况下,通用的方式来获得一个类型的默认值是T.init这里T是你想要的默认值的类型-无论是特定类型或模板参数.