我正在尝试更多地了解 D 的编译时评估,并了解它的模板、mixin、属性等是如何工作的。我想做的一件事是找出一种优雅的方法来将类的成员标记为可序列化或可从数据库加载。在下面的示例中,我创建了一个元组,其中列出了在读取或(稍后)序列化实例时要使用的成员。
我的第一个问题是,如下所示,这是对元组的正确用法吗?其次,如果是这样,有没有办法在编译时使用我分配给相关成员变量的用户定义属性自动生成这个元组?我已经浏览了各种文档页面,例如http://dlang.org/attribute.html和http://dlang.org/phobos/std_traits.html但我似乎无法弄清楚如何正确使用它们这个目的(即遍历一个类的成员并确定哪些变量具有所需的属性)。如果我对应该如何使用属性有完全错误的想法,我也不太确定。任何有关解决此问题的最佳方法的建议将不胜感激。
enum ENCODABLE = 1;
alias string[string] Row;
template Tuple (T...) { alias T Tuple; }
class A {
@(ENCODABLE) string name;
@(ENCODABLE) int x;
int* p;
alias Tuple!("name","x") encodables;
this(Row row) {
foreach (var; encodables) {
__traits(getMember, this, var) = to!(typeof(__traits(getMember, this, var)))(row[var]);
}
}
}
void main() {
Row row = ["name":"Asdf", "x":"120"]; // Simulated database row
auto a = new A(row);
writefln("%s,%d,%d", a.name, a.x, a.p); // Asdf,120,null
}