On Tuesday, 27 June 2023 at 04:56:19 UTC, Ali Çehreli wrote:
On 6/26/23 21:25, Chris Katko wrote:
> How do I get just the field name?
I know .tupleof, which you can typeof() as well:
class myObject{
int field1, field2, field3;
static foreach(field; typeof(this).tupleof)
{
pragma(msg, field.stringof);
}
static foreach(MemberType; typeof(typeof(this).tupleof)) {
pragma(msg, MemberType);
}
}
The output:
field1
field2
field3
int
int
int
I had to consult what I wrote years ago:
http://ddili.org/ders/d.en/tuples.html#ix_tuples..tupleof
Ali
That seems to do the trick, I was really not expecting so much
text just to get something so simple!
At the moment I'm trying to take variables with an attribute
(rep) and then make a duplicate of them inside the struct. It
seems to work. If I had duplicate names, it fails. However, the
new fields don't appear to be showing up on a second enumeration:
enum rep;
struct multiplayerObject2
{
@rep ushort type;
@("rep2") ushort type2;
float x, y;
static foreach(t; typeof(this).tupleof)
{
// no if rep/rep2 here, i'm just testing:
pragma(msg, t.stringof); // does not see any new fields!
mixin("bool " ~ t.stringof ~ "25;"); // copy the fieldname
with a suffix
}
pragma(msg, "-----separator-----");
static foreach(t; typeof (this).tupleof) // again
{
pragma(msg, t.stringof); // does not see any new fields!
}
}
output
```
type
type2
x
y
-----separator-----
type
type2
x
y
```
However, if I do try to force the names to duplicate (say
"type2") I get an error involving some sort of __anonymous
subobject.
```
source/app.d-mixin-123(123,6): Error: variable
`app.multiplayerObject2.__anonymous.type2` conflicts with
variable `app.multiplayerObject2.type2` at source/app.d(116,19)
```
I also never realized you could put a static/static foreach
inside the body of a struct (and not a function) so I'm still
having trouble wrapping my head around that. Is it processing
top-down?
Jonathan M Davis: Yeah, it does what I listed if you add the UDA
to it.