原文
 是否可在没有串插件时传播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() {}
模板插件是否容易受到名字冲突的影响?
 在此