On Monday, 5 June 2023 at 18:54:30 UTC, cc wrote:
On Monday, 5 June 2023 at 13:57:20 UTC, Ki Rill wrote:
How do I generate `setX` methods for all private mutable variables in my class? Do I need to use `__traits`?

```d
mixin template GenerateSetters() {
static foreach (idx, field; typeof(this).tupleof) static if (__traits(getVisibility,field) == "private") {
                mixin(q{
                                void %SETTER(typeof(this.tupleof[idx]) _) {
                                        %NAME = _;
                                }
                        }
                        .replace("%NAME", field.stringof)
.replace("%SETTER", "set"~toUpper(field.stringof[0..1]) ~ field.stringof[1..$])
                );
        }
}
class Rectangle {
        private Color fillColor;
        private Color strokeColor;
        private uint strokeWidth;

        this(int x, int y) {}

        mixin GenerateSetters;
}

void main() {
        auto rect = new Rectangle(0, 0);
        rect.setStrokeWidth(4);
        assert(rect.strokeWidth == 4);
}
```

Thank you! That is exactly what I needed. Although another solution provided by Basile B. using attributes opens a door for other posibilities...

I don't usually use metaprogramming or code generation much, this is an eye-opening experience.

Reply via email to