V0.138
とりあえずD言語V0.138のオモシロそうな機能として,
"string"[constant]と"string"[constant..constant]が
定数になるというのが追加された。
これを応用すると[id:kurimura:20050521]に書いた奴がよりスマートに書ける。
template ULtoString(ulong n,int b:0){ const ULtoString = .ULtoString!(n/10,n/10 < 10) ~ "0123456789"[n%10..n%10+1]; } template ULtoString(ulong n,int b){ const ULtoString = "0123456789"[n%10..n%10+1]; } template ULtoString(ulong n){ alias .ULtoString!(n,n<10) ULtoString; } int main(){ printf("%.*s",ULtoString!(1002)); return 0; }
んー書いてはみたがアマリ面白くない。
たぶん、これ以外にもオモロイ使い方あると思うんだけどなぁ
:追記
Newsgroupsで同じネタあったと、2chで聞いて、なんとなく悔しいので
文字列->数値の関数を自己満足で書いてみた
template SubString(T,int s,int e){ typedef char[] SubString = T.init[s..e]; } template Str2L_(T){ static if(T.init.length == 0){ const r = 0l; }else static if(T.init[0]=='-'){ const r = -.Str2L_!(SubString!( T,1,T.init.length)).r; }else{ const r = T.init[T.init.length-1]-'0' + 10 * .Str2L_!(SubString!( T,0,T.init.length-1)).r; } } template Str2L(T){ alias Str2L_!(T).r Str2L; } int main(){ typedef char[]str ="-232"; printf("%lld",Str2L!(str)); return 0; }
…SubString関数とか書いてると
template用の文字列操作ライブラリが欲しくなってきたなぁ。