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).

Reply via email to