Variadic grouping

monarch_dodra monarchdodra at gmail.com
Mon Jul 29 09:00:45 PDT 2013


On Monday, 29 July 2013 at 15:57:36 UTC, monarch_dodra wrote:
> On Monday, 29 July 2013 at 15:31:39 UTC, bearophile wrote:
>>> How do you tell apart values from not values? :-)
>>
>> Is this brutal enough? :-)
>>
>>
>> enum SameKind(T...) =
>>    __traits(compiles, {enum x = T[0], y = T[1]; }) ||
>>    __traits(compiles, {alias x = T[0]; alias y = T[1]; });
>>
>> template Select(bool condition, T...)
>> if (T.length == 2 && SameKind!T) {
>>    static if (__traits(compiles, {enum x = T[0];})) {
>>        static if (condition)
>>            enum Select = T[0];
>>        else
>>            enum Select = T[1];
>>    } else {
>>        static if (condition)
>>            alias Select = T[0];
>>        else
>>            alias Select = T[1];
>>    }
>> }
>>
>> void main() {
>>    enum x = Select!(true, 10, 20);
>>    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));
>> }
>>
>> Bye,
>> bearophile
>
> But it's still "Select!(true, a, b)" and not "Select!(true, 1, 
> 2)"...


Wait never mind my above post. Your approach works.


More information about the Digitalmars-d mailing list