Variadic grouping

monarch_dodra monarchdodra at gmail.com
Mon Jul 29 08:57:35 PDT 2013


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)"...

Simple overloads could help here?

template Select(bool condition, T1, T2)
{
     static if (condition) alias Select = T1;
     else                  alias Select = T2;
}
template Select(bool condition, alias T1, alias T2)
{
     static if (condition) alias Select = T1;
     else                  alias Select = T2;
}
template Select(bool condition, alias T1, T2)
{
     static if (condition) alias Select = T1;
     else                  alias Select = T2;
}
template Select(bool condition, T1, alias T2)
{
     static if (condition) alias Select = T1;
     else                  alias Select = T2;
}

*Now* Select!(condition, 1, 2) works.


More information about the Digitalmars-d mailing list