Hi!

What is the straightest way to safely cast from one enum type A to another enum type B, when B, in terms of values as well as identifiers, is a strict subset of A?

Ideally, that should be as simple as "to!B(a)". So far I've tried a couple of things, and one way I found was to first cast A to int, then cast that to B, but that is not really straightforward.

Example:

import std.stdio;
import std.conv;

enum Color { r, o, y, g, b, i, v }

enum StyleColor : int { o = Color.o, b = Color.b }

void main()
{
    auto c = Color.g;

    // Problem: the result is not guaranteed to be a StyleColor.
    // Does not throw, needs extra checks.
    auto d1 = cast(StyleColor) c;

    // Typesafe, but is not exactly straightforward.
    auto d2 = to!StyleColor(cast(int) c);

    // Error: template std.conv.toImpl cannot deduce
    // function from argument types !(StyleColor)(Color)
    //
// Changing "enum StyleColor : Color" to "enum StyleColor : int"
    // in the definition above does not help either.
    auto d3 = to!StyleColor(c);
}

Reply via email to