Scale advocacy
    Ali Çehreli 
    acehreli at yahoo.com
       
    Sun Jul  3 13:26:49 PDT 2011
    
    
  
On Sun, 03 Jul 2011 20:07:43 +0000, Ali Çehreli wrote:
> import std.range;
> 
> // ...
> 
> ElementType!Range front_or_null(Range)(Range range) {
>     return range.empty ? null : range.front;
> }
> 
> The template constraint has proven to be problematic though. I will open
> a separate thread about that.
I've figured it out: I've been using "== null" instead of "is null". This 
fails:
import std.range;
ElementType!Range front_or_null(Range)(Range range)
    if (__traits(compiles,
                 { bool result = ElementType!Range.init == null; } ))
{
    return range.empty ? null : range.front;
}
class C
{}
void main()
{
    C[] c;
    front_or_null(c);
}
Replacing "==" with "is" works:
                 { bool result = ElementType!Range.init is null; } ))
I would have liked this simpler syntax to work:
    if (__traits(compiles, { ElementType!Range.init is null; } ))
but it fails without really telling why. Only if I move that expression 
into a code context that I can understand what the problem is. Now trying 
to compile this:
    C.init is null;
produces this error:
Error: is has no effect in expression (null is cast(C)null)
I am grateful for the warning but it was puzzling for a while why the 
simple template constraint was not working. I guess it was a good 
decision to suppress the compiler errors in __traits(compiles). I wonder 
whether __traits(compiles) can be made less strict by eliminating the 
need for the silly 'bool result' in the delegate above.
But this is not a pressing issue at all. :)
Ali
    
    
More information about the Digitalmars-d-learn
mailing list