[static] foreach scope, template declaration ?

Mathias LANG via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Sep 26 04:16:00 PDT 2014


On Thursday, 25 September 2014 at 23:08:53 UTC, SlomoTheBrave 
wrote:
> a way around this is not to use anySatisfy nor the template, 
> for example this works as expected:
>
> [...]
>

My problem is that in this example, attributes are in the same 
order as the parameter. But this come from a code generator, 
which takes class defined by the user, so I have to assume they 
might not be in the correct order :)

> which is less abstruse. However I don't know if it has hurted 
> your eyes too but the output lines order shows there is a 
> problem too:
>
>> Current attr is: p1
>> Instantiated for: p1
>> Instantiated for: p2
>> Instantiated for: p3
>> Current attr is: p2
>> Current attr is: P3
>
> instead of
>
>> Current attr is: p1
>> Instantiated for: p1
>> Current attr is: p2
>> Instantiated for: p2
>> Current attr is: P3
>> Instantiated for: p3
>
> o!o

On Thursday, 25 September 2014 at 23:37:11 UTC, Ali Çehreli wrote:
>
> Surprisingly, that indicates that anySatisfy did instantiate 
> CmpName with all three string values, meaning that perhaps we 
> don't have shortcut behavior for 'bool' eponymous templates.

This is documented 
(http://dlang.org/phobos/std_typetuple.html#.anySatisfy): 
Evaluation is *not* short-circuited if a true result is 
encountered; the template predicate must be instantiable with all 
the given items.

> When I use myAnySatisfy instead of anySatisfy, I see that I am 
> right: The last expression above does not stop instantiating 
> after "p1". In other words, even though myAnySatisfy!(F, T[$/2 
> ..  $ ] is unnecessary (because the first part of || is already 
> 'true'), it gets instantiated anyway.
>
> [...]
>
> This looks like an enhancement request.
>
> Ali

I didn't consider this aspect, and there's definitely ground for 
optimization. However, let's say I replace the definition of 
MyClass with:

----
class MyClass {
     @(UDAStruct("p3"), UDAStruct("P2"), UDAStruct("p1")) // P2 is 
a typo
       void func(int p1, string p2, float p3) {}
}
----


In this case, anySatisfy is right to instantiate all 3 templates 
on the first iteration. Here's the result:

----
$ dmd -unittest -run bug.d
Current attr is: p3
Instantiated for: p1
Instantiated for: p2
Instantiated for: p3
Current attr is: P2
Current attr is: p1
----

There is no needless instantiation in this case, yet we still 
have the same behaviour (static assert not triggered).


More information about the Digitalmars-d-learn mailing list