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

时间:2011-08-30 09:44:48

标签: d

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

3 个答案:

答案 0 :(得分:12)

我认为T.init可能就是你想要的。

答案 1 :(得分:12)

D中的每个类型都有一个默认值。它可以通过类型的init属性访问。 int.initfloat.initObject.init等。对于模板化类型,它仍然是init属性。例如,如果您使用通用类型T,那么它将是T.init

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

的情况下
struct S
{
    int a = 17;
    bool b;
}

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

对于枚举,init属性取决于它的枚举类型。显式常量,例如

enum i = 7;

将具有与其类型(在这种情况下为init)相同的int属性,因为您并未真正创建新类型。但是,对于实际创建新类型的枚举,例如

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

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

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

在任何情况下,获取类型默认值的通用方法是T.init,其中T是您希望默认值的类型 - 是特定类型还是模板参数

答案 2 :(得分:1)

根据codepad.org重新确认:

enum Foo {
  a = 3,
  b = 2,
}

import std.stdio;
void main() { writef("%d", Foo.init); }

给出:

  

3