https://issues.dlang.org/show_bug.cgi?id=20410

Simen Kjaeraas <[email protected]> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |[email protected]

--- Comment #1 from Simen Kjaeraas <[email protected]> ---
This is only true where the base type of the enum fits one of the other
patterns that ReplaceTypeUnless looks for, e.g. U[], U*, etc. - it will leave
regular enums well enough alone, but string enums and the like will decay to
their base types. Of course, there is a discussion to be had here - should the
type change if I do this?

import std.typecons : ReplaceType;

enum Foo : string { bar = "baz" }

pragma(msg, ReplaceType!(char, int, Foo));

Currently, that'd be immutable(int)[], since Foo is a kind of
immutable(char)[], and I've asked to replace char with int.

While there are arguments to be had on both sides of this, I'd go with treating
enums as opaque, since it's easier to forcibly decay them than filter them out
beforehand.

Should be a simple two lines here:
https://github.com/dlang/phobos/blob/58cb6963fbe54e7dc96ae8b48064e84f1eaf818a/std/typecons.d#L8748

        else static if (is(T[0] == enum))
            alias ReplaceTypeUnless = T;

test case:

@safe unittest
{
    enum Enum : string { foo = "Bar" }
    assert(is(ReplaceType!(char, int, Enum)[0] == Enum));
}

--

Reply via email to