Bug 8012 – Add .length field to enums or provide helper function to Phobos
Status
RESOLVED
Resolution
DUPLICATE
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-05-01T13:44:00Z
Last change time
2012-05-01T15:39:37Z
Assigned to
nobody
Creator
andrej.mitrovich
Comments
Comment #0 by andrej.mitrovich — 2012-05-01T13:44:17Z
My use-case:
enum Foo
{
x,
z,
y
}
enum Bar : Foo
{
x = Foo.x,
y = Foo.y,
z = Foo.z
}
I really want to ensure that when I update Foo I will be forced to update Bar (IOW get a compile-time error). If enums had a .length property then I could easily add a static assert:
static assert(Foo.length == Bar.length);
As a workaround (if the proposal is rejected), we might add this template to Phobos:
template EnumLength(E)
if (is(E == enum))
{
enum EnumLength = [__traits(allMembers, E)].length;
}
Used like so:
static assert(EnumLength!Foo == EnumLength!Bar);
I'd prefer having .length over instantiating templates, but either is fine for me.
Comment #1 by andrej.mitrovich — 2012-05-01T13:47:14Z
Oops I marked it wrong. It's an enhancement request.
Comment #2 by bearophile_hugs — 2012-05-01T15:27:54Z
(In reply to comment #0)
Dupe of Issue 4997 ?
> template EnumLength(E)
> if (is(E == enum))
> {
> enum EnumLength = [__traits(allMembers, E)].length;
> }
This is enough, no need to create an array:
template EnumLength(E) if (is(E == enum))
{
enum EnumLength = __traits(allMembers, E).length;
}
But your problem is probably solved in another way, creating an "enum duplicator".
Comment #3 by andrej.mitrovich — 2012-05-01T15:39:37Z
(In reply to comment #2)
> (In reply to comment #0)
>
> Dupe of Issue 4997 ?
Yeah, I'll close this then.
> This is enough, no need to create an array:
>
> template EnumLength(E) if (is(E == enum))
> {
> enum EnumLength = __traits(allMembers, E).length;
> }
Thanks, I forgot tuples have length.
> But your problem is probably solved in another way, creating an "enum
> duplicator".
Well in my real code the "subtyped" enum has different field names but the same values as another enum. Anyway it's not an issue as long as I can get the length of the enum.
*** This issue has been marked as a duplicate of issue 4997 ***