...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

type ident = void; と alias this による初期化遅延実験

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だったらそう書けてるのか.
なんだこれ.