d中构域和属性作为别名
原文
B.J:
它是CPU
模拟器,函数需要操作半个寄存器(CPU
有16
位AF
寄存器,但我想操作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);
}
只需在嵌套函数
中声明它,就可按需用get
和set
.如果有一堆函数要这样,可用mixin
等.或者,创建用opAssign/别名 本
等来包装该字段
的辅助
结构,并在对象内保存s指针
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现