型比較またはテンプレート構文の謎
現在、鬼車(http://www.geocities.jp/kosako3/oniguruma/index_ja.html)のD言語ポーティング作業を行っている最中である。進捗は絶賛遅滞している最中であり、大変申し訳ないかぎりであると、陳謝したい。
さて、そのプロジェクトの中で、delegate型をfunction型にする(例:int delegate(char,int) -> int function(char,int)、テンプレート関数 FunctionTypepOf を作る羽目になった。
問題は、そこで起きた。以下に示す。
version( Tango ){ import tango.core.Traits; import tango.io.Stdout; auto writefln = &Stdout.formatln; auto format = "{}"; } else { // Phobos import std.traits; import std.stdio; auto format = "%s"; } template FunctionTypeOf( Fn ) { version( Tango ){ alias ReturnTypeOf!(Fn) R; alias ParameterTupleOf!(Fn) A; } else { // Phobos alias ReturnType!(Fn) R; alias ParameterTypeTuple!(Fn) A; } alias R function(A) FunctionTypeOf; } void main() { alias int delegate(char[],int) T1; alias int function(char[],int) T2; writefln( format, is(FunctionTypeOf!(T1) == T2) ); // fig.1 writefln( format, is(FunctionTypeOf!(T1).FunctionTypeOf == T2) ); // fig.2 }
出力結果は以下のとおりである。DMD1.0+tangoと、DMD2.0+Phobosの両方で試したが、出力結果は同じであった。
C:\develop2\test_site>functypeof.exe false true
問題は、上記ソースのfig.1とfig.2のところと、その出力結果である。本来なら同じ意味であるはずの構文fig.1とfig.2であるにもかかわらず、出力結果が見事に食い違っている。さて、間違っているのはis構文なのか、テンプレートか、それとも不肖の頭なのか。謎だ……。
追記
Twitter上で垂れ込みがありました(感謝!)
FunctionTypeOfのメンバが、「FunctionTypeOf1つだけではなかったため」だそうです*1。これを踏まえて、ソースを以下のとおりに修正しました。
version( Tango ){ import tango.core.Traits; import tango.io.Stdout; void writefln(A...)(char[] fmt, A a){ Stdout.formatln(fmt,a); } auto format = "{}"; } else { // Phobos import std.traits; import std.stdio; auto format = "%s"; } template FunctionTypeOf( Fn ) { version( Tango ){ alias ReturnTypeOf!(Fn) function(ParameterTupleOf!(Fn)) FunctionTypeOf; } else { // Phobos alias ReturnType!(Fn) function(ParameterTypeTuple!(Fn)) FunctionTypeOf; } } void main() { alias int delegate(char[],int) T1; alias int function(char[],int) T2; writefln( format, is(FunctionTypeOf!(T1) == T2) ); // fig.1 writefln( format, is(FunctionTypeOf!(T1).FunctionTypeOf == T2) ); // fig.2 }
結果は以下のとおりです。
-
- dmd1.0+tango
1 0
-
- dmd2.0+Phobos
true false
微妙に違う気もしなくも無いですが、少なくとも不肖が想定したとおりの出力になりました。なんとも初心者くさいミスでし申し訳ない限り……。
*1:ドキュメント(http://www.kmonos.net/alang/d/1.0/template.html)のクラステンプレートの項を参照