D 如何获取泛型类型的默认值?
我使用的是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。对于字符类
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); }