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