我正在使用D语言,并希望获得泛型类型的默认值,类似于default(T)
在C#中的工作方式。这可能吗?如果不是 - 可能的解决方法是什么?
答案 0 :(得分:12)
我认为T.init
可能就是你想要的。
答案 1 :(得分: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;
}
S.init
将是S
a
为17
且b
为false
的{{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