Hello Sam,

Hello,

For the given example below,

E1:
template Chain(R...) if (allSatisfy!(isInputRange, R))
{
static if (R.length > 1)
alias ChainImpl!(R) Chain;
else
alias R[0] Chain;
}
Q1: What's *if* statement doing right after the template definite?I
can guess what the purpose is but I can not find the answer from the
spec.

E2:
template isInputRange(R)
{
enum bool isInputRange = is(typeof(
{
R r;             // can define a range object
if (r.empty) {}  // can test for empty
r.popFront;          // can invoke next
auto h = r.front; // can get the front of the range
}()));
}
Q2:What's the logic inside the enum...{} blocks?

That is an odd construct and not an enum block, breaking it into pieces:

enum bool isInputRange = SomeBoolExp;

SomeBoolExp:  // true if SomeExp is a valid expression
   is(typeof(SomeExp))

SomeExp:  // a function call
   SomeFnExp()

SomeFnExp: // a delegate literal
   {
      R r;             // can define a range object
      if (r.empty) {}  // can test for empty
      r.popFront;          // can invoke next
      auto h = r.front; // can get the front of the range
   }


Q3:The *typeof* expression here. is it an anonymous function/delegate
which return a bool value?If not,how come there is a () pairs appeared
right after the enum{}blocks?If yes,shouldn't the () pairs appear
before the last *)* ?
It would be grateful if anybody can help.

see above


Regards,
Sam


Reply via email to