hasStaticMember and enums

Steven Schveighoffer schveiguy at gmail.com
Mon Sep 21 23:33:17 UTC 2020


I was confused today when I was looking to see if a particular field 
name was a field of a struct and not a static member.

I thought __traits(hasMember, T, item) && !hasStaticMember!(T, item) 
would suffice. But then I found that this returns true for enums that 
are part of the type.

struct S
{
    enum e = "hello";
}

static assert(__traits(hasMember, S, "e"));
static assert(!hasStaticMember!(S, "e"));

The reason is because hasStaticMember ultimately uses:

alias sym = Alias!(__traits(getMember, U, member));
...
enum hasStaticMember = __traits(compiles, &sym);

which of course doesn't compile for an enum.

But I would actually consider an enum to be a static member. It's a 
member, but does not consume any part of the instance.

The docs for hasStaticMember are pretty slim, but it was added here: 
https://github.com/dlang/phobos/pull/5112

There is no mention of how this should play with enums. Would it be bad 
to add a check for enums in this? I was thinking of changing the 
__traits(compiles) line to:

__traits(compiles, (auto ref a) { } (sym));

or something like that.

Thoughts?

I'm also not sure why std.meta.Alias is used instead of a normal alias 
(maybe that used to be an issue? I tried just a straight alias and it 
works at least in this case).

-Steve


More information about the Digitalmars-d mailing list