On Tuesday, 26 December 2017 at 16:15:55 UTC, Adam D. Ruppe wrote:
The mistake you're making is using a constraint when you should try a specialization:


int signbit(T:Custom)(T x)
{
    return 0;
}


That means to use this specialized function when T is Custom. Now, you just need to merge the overload sets:

import std.math;
alias signbit = std.math.signbit; // this merges local signbit with std.math.signbit


and boom it should compile and call your version.

"Custom" is a templated struct. I cannot imagine all the instantiations of Custom to write template specialisations for each of them.

My opinion is that the mistake is in std.math, because std.math.signbit accepts any type instead to be constrained to float types. Actually, calling std.math.signbit with any other type than float will result in compiler error because signbit expects some float traits for the provided type:

int signbit(X)(X x) @nogc @trusted pure nothrow
{
    alias F = floatTraits!(X);
    return ((cast(ubyte *)&x)[F.SIGNPOS_BYTE] & 0x80) != 0;
}


Reply via email to