On Tuesday, 7 August 2018 at 07:33:49 UTC, Nicholas Wilson wrote:
so the following
void foo(As...)(As as)
in
{
   static foreach (a ;as)
   assert(a>0);
}
do
{
}

void main()
{
     foo(1,2,3,4,5);
}

passes and compiles, whereas

void foo(As...)(As as)
static foreach (a ;as)
    in(a>0)
{
}

void main()
{
     foo(1,2,3,4,5);
}

does not compile. I suppose thats fair enough, there is after all a not very verbose workaround.

I only note this because in researching examples for my multiple template constraints DIP[1], I noticed while I can make individual clauses easier to understand, I realised that recursive templates clauses are still going to be horrible so it would be useful to be able to do

void foo(As...)(As as)
static foreach (alias A ;As)
    if(isFoo!A)
{
    //...
}
[...]
Should this work? And is this something people would like to see added to the DIP?

No. At this point syntax of contracts or constraints is getting *really* mad. I think it's better to put the static loop in the function body, especially since with assert you can format a nice message, while not with constraints.


Reply via email to