import std.stdio; struct Int { private: int v; bool assigned; public: this(int i) { write(" [init] "); v = i; assigned = true; } int get() { if (!assigned) { write(" [init] "); v = 1; assigned = true; } return v; } void get(int i) { write(" [init] "); v = i; assigned = true; } alias get this; } void main() { Int a; write("(", a.v, ",", a.assigned, ")"); int w = a + 0; // 初めて int 化するときに初期化される(でも +0 または cast(int) が必要...) write("(", a.v, ",", a.assigned, ")"); writeln(); Int b = 100;// 普通の引数付きコンストラクタで初期化される write("(", b.v, ",", b.assigned, ")"); int x = cast(int)b;//初期化済みなので b.v は変化しない write("(", b.v, ",", b.assigned, ")"); writeln(); Int c = void; write("(", c.v, ",", c.assigned, ")"); int y = cast(int)c;// 初めて int 化するときに初期化される write("(", c.v, ",", c.assigned, ")"); writeln(); Int d = void; write("(", d.v, ",", d.assigned, ")"); d = 999;// 初めて int 化するときに初期化される write("(", d.v, ",", d.assigned, ")"); writeln(); }
(0,false) [init] (1,true) [init] (100,true)(100,true) (1572448,true) [init] (1,true) (2002059584,true) [init] (999,true)
う〜〜ん・・・.
int 化するためには +0 または cast(int) が必要ってのがどうしようもなさそう.
Int a = void; int xyz = a; // ここで初めて a = 0; に初期化
と簡潔に書けたらよかったのに.
追記
あれー?
構造体じゃなくてclassだったらそう書けてるのか.
なんだこれ.