D言語のどうでも良い話。

D言語にはis式というのがあります。
is(Type) という式はTypeが型として正しければ真を返します。
次にtypeofというのもあります。
typeof(Exp)はExpの式の型を返します
この2個を組み合わせると面白いことができます。

つまり、 is(typeof(Exp)) という式はExpが式として正しければ真を返します。
自分の思いつく使い方としてはtemplateに置いて型の有効性を調べるとか.
別にそんなのを書かなくてもコンパイルエラーは出ますけど
templateの返すエラーって暗号のようにややこしいですし。

//Dには参照型が無いのでポインタでお茶を濁す。
template nil(T){const T*nil=null;}

template isForwardIterator(T){
	// T が forward iteratorか検査する
	const isForwardIterator = 
	//++出来て
	is(typeof(++*nil!(T))) &&
	//単項*が演算子オーバーロードを提供してないので苦肉の策
	//参照できて
	is(typeof( (*nil!(T))[0] )) &&
	//比較できる
	is(typeof( *nil!(T) != *nil!(T) ));
}

template isUnaryFunction(FirstArgument,T){
	// T は FirstArgumentを 受け取る 1 引数の関数
	const isUnaryFunction =
		is(typeof( (*nil!(T))(*nil!(FirstArgument))));
}

template for_each(It,Fn){
	Fn for_each(It begin,It end,Fn fn)
	in{
	//型の検査
		static assert(isForwardIterator!(It));
		static assert(isUnaryFunction!(typeof(begin[0]),Fn));
	}body{
		for(;begin != end ;++begin)
			fn(begin[0]);
		return fn;
	}
}
import std.c.stdio;
void main(){
	char[]r="Hello World\n";
	for_each!
		(char*,typeof(&putchar))(r.ptr,r.ptr+r.length,&putchar);
}

むー書いてみたけどイマイチ役に立たなさそう。
それに関数templateが無いからfor_eachも醜いし。
なんか、もっと面白い使い方ないかなぁー