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

D 如何获取泛型类型的默认值?,d,D,我使用的是D语言,希望获得泛型类型的默认值,类似于default(T)在C#中的工作方式。这可能吗?如果没有-可能的解决方法是什么?我认为T.init可能是您正在寻找的。D中的每个类型都有一个默认值。它通过类型的init属性访问int.init,float.init,Object.init,等等。对于模板类型,它仍然是init属性。例如,如果您有泛型类型T,则它将是T.init init通常最接近该类型的错误值。对于整型,它是0。对于bool,它是false。对于浮点类型,它是NaN。对于字符类

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

我认为
T.init
可能是您正在寻找的。D中的每个类型都有一个默认值。它通过类型的
init
属性访问
int.init
float.init
Object.init
,等等。对于模板类型,它仍然是
init
属性。例如,如果您有泛型类型
T
,则它将是
T.init

init
通常最接近该类型的错误值。对于整型,它是
0
。对于
bool
,它是
false
。对于浮点类型,它是
NaN
。对于字符类型,它是
\u00FF
。对于引用(即类)和指针,它是
null
。在结构的情况下,它的成员变量直接初始化为什么值。e、 g.在以下情况下:

struct S
{
    int a = 17;
    bool b;
}
S.init
将是
S
的一个实例,其
a
17
b
false
。需要特别注意的是,需要
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
是您想要默认值的类型-可以是特定类型或模板参数。

根据以下内容重新枚举:

给出:

三,


值得注意的是,
char.init='\xFF'
。我想我会错过一些类型,但我想不起在写我的初始答案时会发生什么。希望它们现在都在各自的位置上。@JonathanMDavis:如果我在main()函数中声明局部变量,比如int I;如果不初始化它,它的默认值将始终为0?@PravasiMeet变量默认初始化为它们的
init
值,
int.init
0
,所以是的。但是,值得注意的是,
writeln(Foo.init)
将打印
a
,而不是
3
enum Foo {
  a = 3,
  b = 2,
}

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