How do I generate `setX` methods for all private mutable variables in a class?

Steven Schveighoffer schveiguy at gmail.com
Tue Jun 6 14:23:59 UTC 2023


On 6/5/23 11:33 AM, Basile B. wrote:
> On Monday, 5 June 2023 at 15:13:43 UTC, Basile B. wrote:
>> On Monday, 5 June 2023 at 13:57:20 UTC, Ki Rill wrote:
>>> How do I generate `setX` methods for all private mutable
>>
>> although I did not spent time on the setter body... I suppose the 
>> question was more about the metprogramming technic, and that you don't 
>> want a pre-mashed solution ;)
> 
> By the way...an other solution is to use 
> [opDispatch](https://dlang.org/spec/operatoroverloading.html#dispatch):
> 
> ```d
> class Color {}
> 
> class Rectangle {
>      private Color fillColor;
>      private Color strokeColor;
>      private uint strokeWidth;
> 
>      auto opDispatch(string member, T)(auto ref T t)
>      {
>               static if (member == "setStrokeWidth") {}
>          else static if (member == "setStrokeColor") {}
>          else static if (member == "setFillColor") {}
>          else static assert(0, "cannot set " ~ member);
>          return this;
>      }
> }
> 
> void main()
> {
>      (new Rectangle)
>          .setStrokeWidth(0)
>          .setStrokeColor(null)
>          .setFillColor(null);
> }
> ```

Ugh, don't do it that way. Always give opDispatch a template constraint 
or it will suck to use.

Also, given the problem constraints, you can build the method 
automatically using the string.

```d
auto opDispatch(string member, T)(auto ref T t) if(member.startsWith("set"))
{
    mixin(toLower(m[3]), m[4 .. $], " = t;");
}
```

-Steve


More information about the Digitalmars-d-learn mailing list