On 07/27/2016 08:42 AM, stunaep wrote:
On Wednesday, 27 July 2016 at 15:32:59 UTC, Meta wrote:
On Wednesday, 27 July 2016 at 13:59:54 UTC, stunaep wrote:
So how would I make a function that takes an enum and an id as a
parameter and returns a member in the enum? I tried for quite some
time to do this but it wont let me pass Test as a parameter unless I
use templates. I finally came up with this but it wont let me return
null when there's nothing found

E findEnumMember(E)(int id) if (is(E == enum)) {
    auto found = [EnumMembers!E].find!(a => a.id == id)();
    if(!found.empty)
        return found.front;
    else
        ...What do I return? null gives error
}

If you're going to do it like this your only real options are to
return a Nullable!E or throw an exception if the id isn't found.

I tried Nullable!E earlier and it didnt work.

import std.traits;
import std.algorithm;
import std.array;
import std.typecons;

Nullable!E findEnumMember(E)(int id) if (is(E == enum)) {
    auto found = [EnumMembers!E].find!(a => a.id == id)();
    if(!found.empty)
        return Nullable!E(found.front);
    else
        return Nullable!E();
}

struct S {
    int id;
}

enum MyEnum : S {
    x = S(42),
    invalid = S()    // Useful for the other alternative
}

void main() {
    auto a = findEnumMember!MyEnum(42);
    assert(!a.isNull);
    auto b = findEnumMember!MyEnum(7);
    assert(b.isNull);
}


I dont need it to be done
like this, it just has to be done someway. I'm asking for help because
that's the only way I could think of.

Another alternative is to require that the enum has a special sentinel:

    else
        return E.invalid;

Ali

Reply via email to