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λ.

posted @   zjh6  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示