August 07, 2017
On Saturday, 5 August 2017 at 20:11:27 UTC, Matthew Remmel wrote:
> On Saturday, 5 August 2017 at 18:26:10 UTC, Kreikey wrote:
>> On Saturday, 5 August 2017 at 15:33:57 UTC, Matthew Remmel wrote:
>>> I feel like I'm missing something, but there has to be an easier way to convert a value into an enum than switching over every possible value: i.e
>>>
>>> [...]
>>
>> Capitals c = cast(Capitals)"Chicago";
>> writeln(c);    // Illinois
>
> I'm annoyed that I didn't think of trying to cast it. That works great if the value exists in the enum. It does something weird if the value doesn't though. This is my test.d file:
>
> import std.stdio;
>
> enum Foo {
>     A = "AV",
>     B = "BV"
> }
>
> void main() {
>     Foo k = cast(Foo)"BV"; // Works and prints correctly
>
>     k = cast(Foo)"CV";
>     writeln("Type: ", typeid(k));  // Type: test.Foo
>     writeln("Value: ", k);       // Value: cast(Foo)CV
> }
> --------
> The output shows the type being the Foo enum but the value is 'cast(Foo)CV'. I would of expected an error or exception to be thrown if it wasn't able to cast into an actual enum member. Is this something with how the enums are implemented under the hood?

So I've come up with a concise way to do this. Given:

Capitals strToEnum(string myString) {
  Capitals instance = cast(Capitals)myString;
  if (![EnumMembers!Capitals].canFind(instance))
    throw new Exception("can't convert that string to that enum");
  return instance;
}

do:

Capitals c = strToEnum("Chicagoo");

Not quite a one-liner, but pretty close. Turning it into a template is left to the user as an exercise ;)
1 2
Next ›   Last »