On Sunday, 17 June 2018 at 04:32:29 UTC, Jonathan M Davis wrote:
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
Thanks for your answers. It's so glad to see some works have been
taken for this.
The isManifestConstant is really necessary. For example, I want
to port an Enum type from Java to D. It seems better to use a
Struct instead of an Enum.
See here:
https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java
https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-http/src/main/java/org/eclipse/jetty/http/HttpHeaderValue.java
Of course, I can define a enum for members with the basic types
in D.
Sometimes, I like to define them in a class or struct as manifest
constants or immutable ones. So, I need isManifestConstant.