【问题标题】:How do I get the default value of a generic type?如何获取泛型类型的默认值?
【发布时间】:2011-08-30 09:44:47
【问题描述】:

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

【问题讨论】:

    标签: d


    【解决方案1】:

    我认为T.init 可能是您正在寻找的。​​p>

    【讨论】:

      【解决方案2】:

      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.initS 的一个实例,其a17bfalse。特别需要注意的是,需要 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.init0,所以是的。
      【解决方案3】:

      重新枚举,根据codepad.org

      enum Foo {
        a = 3,
        b = 2,
      }
      
      import std.stdio;
      void main() { writef("%d", Foo.init); }
      

      给予:

      3

      【讨论】:

      • 然而,值得注意的是writeln(Foo.init) 将打印a 而不是3
      猜你喜欢
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 2011-02-14
      • 2022-08-05
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多