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 ;)