Variadic grouping
Artur Skawina
art.08.09 at gmail.com
Mon Jul 29 13:51:09 PDT 2013
On 07/29/13 22:43, Artur Skawina wrote:
> On 07/29/13 17:24, bearophile wrote:
>> Maybe there is a way to allow that too:
>>
>>
>> template Select(bool condition, T...) if (T.length == 2) {
>> static if (condition)
>> enum Select = T[0];
>> else
>> enum Select = T[1];
>> }
>>
>> void main() {
>> enum x = Select!(true, 10, 20);// error
>> static assert(x == 10);
>> int a = 1;
>> int b = 2;
>> alias y = Select!(true, a, b);
>> assert(y == 1);
>> alias T = Select!(true, int, long);
>> static assert(is(T == int));
>> }
>>
>>
>> How do you tell apart values from not values? :-)
>
> template Select(bool condition, T...) if (T.length == 2) {
> static if (__traits(compiles, function { alias _1 = T[0]; alias _2 = T[1]; }))
> alias Select = T[!condition];
> else
> enum Select = T[!condition];
> }
Or even:
template Select(bool condition, T...) if (T.length == 2) {
static if (__traits(compiles, function { alias _ = T[!condition]; }))
alias Select = T[!condition];
else
enum Select = T[!condition];
}
but that's a bit /too much/ magic -- allowing
alias y1 = Select!(true, b, int);
assert(y1 == 2);
alias y2 = Select!(false, b, int);
assert(is(y2==int));
is "neat", but could be confusing...
artur
More information about the Digitalmars-d
mailing list