【发布时间】:2011-08-30 09:44:47
【问题描述】:
我正在使用 D 语言,并且想要获取泛型类型的默认值,类似于 default(T) 在 C# 中的工作方式。这可能吗?如果不是 - 可能的解决方法是什么?
【问题讨论】:
标签: d
我正在使用 D 语言,并且想要获取泛型类型的默认值,类似于 default(T) 在 C# 中的工作方式。这可能吗?如果不是 - 可能的解决方法是什么?
【问题讨论】:
标签: d
我认为T.init 可能是您正在寻找的。p>
【讨论】:
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。特别需要注意的是,需要 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'.
init 值,int.init 是 0,所以是的。
重新枚举,根据codepad.org:
enum Foo {
a = 3,
b = 2,
}
import std.stdio;
void main() { writef("%d", Foo.init); }
给予:
3
【讨论】:
writeln(Foo.init) 将打印a 而不是3。