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指针.
浙公网安备 33010602011771号