d中构域和属性作为别名

原文
B.J:
它是CPU模拟器,函数需要操作半个寄存器(CPU16AF寄存器,但我想操作A).我已按一对属性函数实现寄存器的"A"部分:

@property ubyte a() const { return getHigh!af; }
@property ubyte a(ubyte val) { return setHigh!af(val); }

每个组合(AF,BC,DE)等和(A,B,C,D,E等)半个寄存器都有CPU指令,所以我认为要按属性函数实现半或全寄存器(规范上说,从技术上讲,用联似乎是UB?)
基本上,我想对(增量,加载等)操作编写个模板,然后实例化每个(inc a,inc b,inc c,load a,load b等寄存器).
亚当:
似乎必须按运行时参数传递s才能工作?是的.别名参数传递变量的抽象概念而不是变量:

void main(){
    S s;//s
    func!(s.a)();//实际传递的是`S.a`

这里的s,编译器实际上传递的是S.a,是类型而不是实例引用.
别名用于编译时引用,编译器丢弃了this.
除了别名外,还可传递运行时引用,并用__traits(child)放回在一起,但注意,这样传递时,编译器会变得非常愚蠢,因此需要将func置为静态,因为当它看见别名时,假定必须是成员.奇怪但容易修复:

import std.stdio;

struct S{
    int a = 1;
    int b = 2;

    @property int c(){ return a; }
    @property int c(int newc) { a = newc; return a;}
}	

// 使为静,加个ref S来按`this`动作
static void func(alias field)(ref S s){
     //现在`traits child`重新按this引用附加`s`赋值给别名
 	writeln(__traits(child, s, field));
    __traits(child, s, field) = 5;
}
void main(){
    S s;
    func!(s.a)(s);//传递ct alias及运行时`本`
    func!(s.b)(s);
    func!(s.c)(s);
}

B.J:
__traits(child)是关键,
因为多次使用该字段,尝试为结果置别名:

alias theProp = __traits(child, s, field);

但每次都报错说,缺少this.是否能避免每次用__traits(child)完整式?

亚当:
是的,与模板参数相同,别名再次删除了this,所以不管用.不过,可创建几个帮助函数:

void set(typeof(field) v) {
   __traits(child, s, field) = v;
}

typeof(field) get() {
   return __traits(child, s, field);
}

只需在嵌套函数中声明它,就可按需用getset.如果有一堆函数要这样,可用mixin等.或者,创建用opAssign/别名 本等来包装该字段辅助结构,并在对象内保存s指针.

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