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[]) }
おかげでオーバーロードされた関数の扱いに実に困ります。ガッカリ >_