Since we have the pattern of returning float.nan from opCmp to signal incomparable values, it makes sense to have a trait to identify this behavior. Something like this: template hasNanComparison(T1, T2 = T1) { static if (isFloatingPoint!T1) enum hasNanComparison = true; else static if (!isAggregateType!T1) enum hasNanComparison = false; else static if (!is(typeof((T1 a, T2 b) => a.opCmp(b)))) enum hasNanComparison = false; else enum hasNanComparison = hasNanComparison!(ReturnType!((T1 a, T2 b) => a.opCmp(b))); } /// @safe unittest { assert( hasNanComparison!float); assert( hasNanComparison!real); assert(!hasNanComparison!int); assert(!hasNanComparison!string); assert(!hasNanComparison!(int*)); assert(!hasNanComparison!(int[])); struct S { float opCmp(S s) { return float.nan; } } assert( hasNanComparison!S); struct S2 { S opCmp(S2 s) { return S(); } } assert( hasNanComparison!S2); }
@Biotronic created dlang/phobos pull request #7342 "Fix issue 20478" fixing this issue: - Fix issue 20478 https://github.com/dlang/phobos/pull/7342
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/10401 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB