Dのコンパイル時の評価についてもう少し学び、そのテンプレート、ミックスイン、属性などがすべてどのように機能するかを理解しようとしています。私が試してみたいことの1つは、クラスのメンバーをデータベースからシリアル化可能またはロード可能としてマークするためのエレガントな方法を見つけることです。以下の例では、インスタンスの読み取りまたは(後で)シリアル化するときに使用するメンバーをリストするタプルを作成しました。
私の最初の質問は、これは下にあるタプルの適切な使用法ですか?次に、もしそうなら、関連するメンバー変数に割り当てたユーザー定義の属性を使用して、コンパイル時にこのタプルを自動的に生成する方法はありますか?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
}