型比較またはテンプレート構文の謎

 現在、鬼車(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
true
false

 微妙に違う気もしなくも無いですが、少なくとも不肖が想定したとおりの出力になりました。なんとも初心者くさいミスでし申し訳ない限り……。

*1:ドキュメント(http://www.kmonos.net/alang/d/1.0/template.html)のクラステンプレートの項を参照