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も醜いし。
なんか、もっと面白い使い方ないかなぁー