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