Trouble checking for null-ness

Mike Parker via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jul 25 05:54:55 PDT 2016


On Monday, 25 July 2016 at 12:37:18 UTC, Bahman Movaqar wrote:
> Suppose I have the following function:
>
>     public auto max(alias comp, Range)(Range r)
>     in {
>       assert(r !is null && !r.empty);
>     }
>     body {
>       // ...
>     }
>
> When the function after a series of chained `map` operations, I 
> get the following error:
>
>     Error: incompatible types for ((r) !is (null)):
> 'MapResult!(__lambda2, SInvoiceLine[])' and 'typeof(null)'
>
> Of course if I remove `r !is null` from the `in` block, 
> everything will work.  But I'm curious; how can I check for a 
> `null` in this case?

In the general case, the vast majority of ranges you work with 
will be value types. In the rare case where it's a reference 
type, you can use static if to specialize the assert. Two 
possibilities have already been suggested in this thread, but 
given that ranges are nearly always going to be a struct or a 
class, then you might do this inside the template:

static if(is(Range == class)) { // check for null }

You may also want to add a constraint:

import std.range : isInputRange;
public auto max(alias comp, Range)(Range r) 
if(isInputRange!Range) {
    static if(is(Range == class)) assert(r !is null && !r.empty);
    else assert(!r.empty);
}





More information about the Digitalmars-d-learn mailing list