On Friday, February 21, 2014 12:41:07 Hannes Steffenhagen wrote: > The specific problem here was when working with std.json. > > std.json distinguishes between UINTEGER and INTEGER, so I had > code like > > static if(is(T : ulong)) { > // must be UINTEGER > } else static if(is(T : long)) { > // can be either INTEGER or UINTEGER > } > > > I've since found out about isSigned and isUnsigned, still it was > mighty confusing for me that the first case was selected for > signed types.
Well, it is using : - which means implicit conversion, which is always something that you should be careful with in generic code. Technically, something like struct S { ulong ul; alias ul this; } would match it as well, and depending on what the code inside the static if is like, it might work, but there's also a good chance that it wouldn't. Using is(T == ulong) if you want to require that it be exactly ulong, or isUnsigned!T if you want any unsigned integral type. Using implicit conversion in generic code _can_ be useful, but you need to be _very_ careful with it. - Jonathan M Davis