原文
是否可在没有串插件
时传播UDA
?
为了让它没有模板插件
运行,我需要编写一个递归模板(在模板参数和UDA
实例化结构上递归),它考虑了以下情况:普通类型,模板化类型,枚举(C风格),枚举值编译时常量等.
这是正确的,还是有无法只抓取编译时
别名或枚举,而不给每个"类型
"特殊处理.
模板插件
是否容易受到名字冲突
的影响?
我正在试从另一个
结构继承结构
.我想修改
每个字段,使其类型
从某个T
变为Nullable!T
,并保留所有字段名
和UDA
.
如果在模块级
可见你的类型
,这很容易,而插件
是好工具.只是有点不适合隐藏类型
类型.
struct MyUDA { int q; }
struct Foo { int f; }
struct MyStruct {@MyUDA(3) int x;@MyUDA(4) Foo f;@MyUDA(5) @MyUDA(7) string s;
}
auto generateUDAs(A...)() {string[] udaStrs;static foreach (uda; A)udaStrs ~= "@(" ~ uda.stringof ~ ")";return udaStrs;
}
struct Wrapped(S) {static foreach (idx, field; S.tupleof) {//可用`pragma(msg,format(...))`来预览mixin(format("%s %s %s;", generateUDAs!(__traits(getAttributes, field)).join(' '), Nullable!(typeof(field)).stringof, field.stringof));}
}
void main() {MyStruct s;s.x = 3;s.f = Foo(1);s.s = null;Wrapped!MyStruct w;w.x = s.x;w.f = s.f;w.s = s.s;w.x.nullify;w.f.nullify;w.s.nullify; //串,对象已可为`null`了static assert(__traits(getAttributes, w.s) == AliasSeq!(MyUDA(5), MyUDA(7)));
}
如果绝对
必须,你可以:
enum WrapMixin = q{struct Wrapped(S) {static foreach (field; S.tupleof)mixin(format("%s %s %s;", generateUDAs!(__traits(getAttributes, field)).join(' '), Nullable!(typeof(field)).stringof, field.stringof));}
};
void main() {struct MyUDA { ... }struct MyStruct { ... }mixin(WrapMixin);Wrapped!MyStruct w;
}
:是否可在没有串插件
时传播UDA
?
@(__traits(getAttributes, thingYouWantToForward))
void yourNewThing() {}
模板插件
是否容易受到名字冲突
的影响?
在此