Hi.

I want to somehow list members of a class in the order of their declaration. The immediate goal is to generate a few functions, like the "default" constructor for structs but only with all the fields, or the "reader" function, but I'm interested in the general question as well.

I can go the hard way and wrap every declaration into something that will collect them and then list in the right order. The problem is, the declarations won't look normal then.

The documentation for __traits (allMembers, ...), __traits (derivedMembers, ...) and the like [1] explicitly says that the order is not defined. Still, I've looked at Atila Neves' Cerealed serializer library, and it does use them [2]. Does it mean the order is unlikely to change at this point?

The documentation for std.traits' RepresentationTypeTuple [3] says things are listed in topological order, which formally does not restrict the order for flat structures again. And the underlying implementation [4] of Fields uses .tupleof class property which, in turn, does not list any guarantees on the order [5].

So I'm confused. What is considered the right way to list members when I care about their linear order?

Ivan Kazmenko.

[1] https://dlang.org/spec/traits.html#derivedMembers
[2] https://github.com/atilaneves/cerealed/blob/master/src/cerealed/cereal.d#L467 [3] https://dlang.org/phobos/std_traits.html#RepresentationTypeTuple [4] https://github.com/dlang/phobos/blob/10cd84a/std/traits.d#L2279
[5] https://dlang.org/spec/class.html#class_properties

Reply via email to