Variadic grouping
bearophile
bearophileHUGS at lycos.com
Mon Jul 29 07:10:40 PDT 2013
> A possible static ternary operator syntax:
>
> enum foo = ct_cond !? Foo!5 : Bar!6;
>
> But in my opinion the need for it is not strong enough, better
> to keep the language simpler.
A static ternary operator is sometimes handy, this is working
code:
import std.typetuple: TypeTuple;
template Iota(int n) {
static if (n <= 0)
alias TypeTuple!() Iota;
else
alias TypeTuple!(Iota!(n-1), n-1) Iota;
}
void main() {
int[3] a, b;
foreach (i; Iota!3)
a[i] = b[i];
}
With the recently introduced syntax for enum and templates you
could assume this works:
enum Iota(int n) = (n <= 0) ?
TypeTuple!() :
TypeTuple!(Iota!(n-1), n-1);
But that's a regular ternary operator, so despite only one branch
is computed, both are verified for type, because they have to
return the same type, so it gives:
Error: template instance test.Iota!-497 recursive expansion
A static ternary operator is allowed to return two different
types, so no type is computed for the other branch, and this
works:
enum Iota(int n) = (n <= 0) !?
TypeTuple!() :
TypeTuple!(Iota!(n-1), n-1);
Bye,
bearophile
More information about the Digitalmars-d
mailing list