入れ子の定義

今日は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言語ではどうするべきか悩ましい。