入れ子の定義
今日はD言語の関数テンプレートでふと思った。
関数テンプレートって入れ子に出来るのだろうか?
というわけで、実験実験。
private import std.stream; template lexical_cast(To){ template lexical_cast(From){ To lexical_cast(From from){ To to; auto MemoryStream s = new MemoryStream; s.writef("%s",from); s.position = 0; s.readf(&to); return to; } } } void main(){ printf("%.*s\n",lexical_cast!(char[])(1000)); printf("%d\n",lexical_cast!(int)("1000")); }
お、コンパイルは通るみたい。よしよし、入れ子の関数テンプレートも問題ないっぽいな。
これで部分的に型を指定したテンプレート関数(C++とかだとboost::lexical_castとかboost::any_castみたいな関数)
も記述できるな
それと例で適当に書いたコードだけど、
Streamを使っているから、使える型が限定されるという欠陥がある。
残念ながら回避方法を思いつかず。
C++とかだとiostreamを左項に持つoperator<<,operator>>を定義して回避できるけど、
D言語ではどうするべきか悩ましい。