On Sunday, 17 June 2018 at 02:44:38 UTC, Heromyth wrote:
Here is a struct named S:

struct S
{
        enum X = 10;
        enum Y
        {
          i = 10
        }
        enum Z = "str";
        struct S {}
        class C {}

        static int sx = 0;
        __gshared int gx = 0;

        shared void g();        
}

I want list all then the manifest constants in it.

I searched the std.traits and this forums, but get nothing.
Maybe, my real question is how to get the storage class for a member in a class or struct.

Thanks.

I think this bolts.isManifestAssignable [1] will get you partially there. The place where it'll fail though is a static immutable (since they are assignable to manifest constants) but you can filter those by seeing if you can take the address, something like:

foreach (m; __traits(allMembers, T)) {
  if (isManifestAssignable!(T, m) && !is(typeof(mixin("&T."~m))) {
    // it's a manifest constant ... (?)
  }
}

There of course might be edge cases I can't think of/don't know about though.

Cheers,
- Ali

http://bolts.dpldocs.info/bolts.traits.isManifestAssignable.html


Reply via email to