On Sunday, 2 July 2023 at 17:02:44 UTC, Paul wrote:
I have a struct similar to the following example. I'd like to build an adder method without having to code the whole method. How do I use the D language to do this? Template, mixins, CTFE..all of them?

```d
struct myS {
    int a, b, c, d, e, f, g, h, i;
    adder(string s, int n) {
        final switch (s) {
            case "aa" :
                a += n; break;
            case "bb" :
                b += n; break;
           ...
```
Thanks for any assistance.

Thanks for your interesting question!

```
module mys;
import std.exception;

class UnknownRegister : Exception {
   mixin basicExceptionCtors;
}

enum string [] DefaultRegisterSet = [
      "a", "b", "c", "d", "e", "f", "g", "h", "i"
   ];

struct myS {
   int [string] registers;

   this (string [] register_names)
   {
      foreach (r; register_names)
         registers [r] = 0;
   }

   void adder (string s, int n)
   {
      auto p = s in registers;
      enforce!UnknownRegister (p);
      *p += n;
   }

   int opDispatch (string s) ()
   {
      auto p = s in registers;
      enforce!UnknownRegister (p);
      return *p;
   }
}

unittest {
   auto m = myS (DefaultRegisterSet);
   m.adder ("a", 7);
   m.adder ("a", 8);
   assert (m.a == 15);
   assertThrown!UnknownRegister (m.adder ("j", -1));
   assertThrown!UnknownRegister (m.j == 0);
}
```

Reply via email to