std.traits

今日はstd.traitsの謎に迫ります!
テンプレート引数に渡された関数がオーバーロードされてる時はどうなってるんでしょう、と言う話です。
結論から言うと始めに宣言されたものが返ってきます…

int f(int x){ return x; }
char[] f(char[] s){ return s; }
char[] f_(char[] s){ return s; }
int f_(int x){ return x; }
void main(){
    writefln(typeid(ReturnType!(f)));           // int
    writefln(typeid(ParameterTypeTuple!(f)));   // (int)
    writefln(typeid(ReturnType!(f_)));          // char[]
    writefln(typeid(ParameterTypeTuple!(f_)));  // (char[])
}

おかげでオーバーロードされた関数の扱いに実に困ります。ガッカリ >_