d类成员的默认值
class X
{
this()
{
assert(false);//
}
int x = 3;
}
在X中,我不能添加或更改方法.
编译时,如果有X和"x"字段名,我如何获得3,对构,可:
X.init.x
//或
__traits(getMember, X.init, "x")
工作.但对类,它会抱怨解空引用.
__traits(initSymbol)
不管用.
不可能.与构的初值符号不同,类版不一定代表有效实例状态,它只是调用构造器(构造有效实例)前的原始负载,且在实例化对象后,重置为死状态内存(以避免死指针让其他GC引用活跃).
如果在CTFE中构造器工作,可:
int get() {
scope x = new X;
return x.x;
}
enum bla = get();
来取(如在构造器中修改,则与静初化不同的)有效实例的x值.
为何要编译时静初化?__traits(initSymbol)是运行时辅助块传输.
在SQL数据库中,(与UDA一起使用时)我想按默认值使用静初化器.
用当前设计,不能从编译时移动到运行时,因为在另一个程序(迁移器)中使用序化并输出创建的类型描述.现在,它只是取生成的编译时构,然后直接转储到JSON序化程序中.
可能有点滥用类,但它们最简单:
1,更容易编写和使用is(T : Model)和void foo(T : Model)(T x)类型特化.
2,允许注入方法到类型中(使用this This,模板参数甚至可得到真实类型)
3,对用户,这是最容易和漂亮类型.mixin Model太麻烦,且因为会破坏隐式生成的构造器,而禁止定义自定义字段.
好的,是什么阻碍了这些模型的CTFE构造呢?
在Model中有个对子类型的所有字段运行可选的如下λ用定属的模板基构造器.
@constructValue!(() => Clock.currTime + 4.hours)
不能用继承类型中的默认构造器替换这些吗?
class MyModel : Model {
int x = 123; // 静态初化
SysTime validUntil; // 构造器中动态初化
this() {
validUntil = Clock.currTime + 4.hours;
}
}
是可CTFE构造该实例的,且对validUntil字段,有效实例会生成期望值.如果要了解此类动态生成字段(如,在此时间关键示例中),可查看@dynamicallyInitialized用定属.如果还要,对已构造实例,可重运行这些当前@constructValueλ,则创建新的实例并复制新字段值.
哦,时间敏感示例显然不支持CTFE.如果这样,则不必用@constructValue了.
对CTFE实例,如果可接受跳过此额外初化,还可在构造器中用if (__ctfe)跳过跑@constructValueλ.
浙公网安备 33010602011771号