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.

Reply via email to