On Tuesday, 25 August 2020 at 12:50:35 UTC, Steven Schveighoffer wrote:
The situation is still confusing though. If only 'std.range.ElementType' is imported, a static array does not have a 'front' member, but ElementType still gets the correct type. (This is where the documentation says it'll return void.)

You are maybe thinking of how C works? D imports are different, the code is defined the same no matter how it is imported. *your* module cannot see std.range.primitives.front, but the range module itself can see that UFCS function.

This is a good characteristic. But the reason it surprised me was that I expected to be able to manually expand the ElementType (or ElementEncodingType) template see the results of the expressions it uses.

   template ElementType(R)
   {
       static if (is(typeof(R.init.front.init) T))
           alias ElementType = T;
       else
           alias ElementType = void;
   }

So, yes, I was expecting this to behave like an inline code expansion.

Yesterday I was doing that for 'hasSlicing', which has a more complicated set of tests. I wanted to see exactly which expression in 'hasSlicing' was causing it to return false for a struct I wrote. (Turned out to be a test for 'length'.)

I'll have to be more careful about this.

Reply via email to