On Tuesday, 28 October 2014 at 22:55:24 UTC, IgorStepanov wrote:
You may see isFloatingPoint declaration in traits.d:
enum bool isFloatingPoint(T) = is(FloatingPointTypeOf!T) &&
!isAggregateType!T;
This template explicitly says that T shouldn't be an aggregate
type. Thus
std.math.isNaN(X)(X x) if (isFloatingPoint!X)
shouldn't accept a struct.
Although alias this is supposed to denote subtyping, here is a
violation of the Liskov Substitution Principle; although S is a
subtype of float, there are some cases where it's invalid to
substitute an S for a float. This seems like a problem with alias
this to me. As S is aliased to float, typeof(s.val) should be
passed to isFloatingPoint if passing S fails.