On Sunday, June 17, 2018 02:44:38 Heromyth via Digitalmars-d-learn 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.

As the storage class isn't part of the type, type introspection tends to
ignore it. You'll basically have to get the full list of members of the type
and then filter out stuff that isn't a manifest constant, which is not
exactly pleasant and can get a bit tricky but should be possible. You'll
probably have to do something like filter out all of the members where you
can take their address and filter out all of the ones that are types, and
and at that point, you'd be close, but I'd have to experiment to figure out
whether that was enough or not or whether something crept through.

Andrei has been working on coming up with a better wrapper around the
current introspection stuff so that you'll actually get data types which
contain the information about a symbol rather than having to figure out
which combination of __traits and traits from std.traits are required to get
what you want. So, I expect that stuff like this will get a lot easier once
that's ready, but in the interim, if you're trying to do something less
common, it can involve having to do a lot clever filtering to get exactly
the stuff you want and only the stuff you want - and I don't think that
getting the list of manifest constants in a type is a very typical thing for
folks to do, so std.traits certainly doesn't have anything like
isManifestConstant.

- Jonathan M Davis

Reply via email to