Using Enums to Generate Scoped List of Names

Andrey Zherikov andrey.zherikov at gmail.com
Thu Aug 4 23:31:37 UTC 2022


On Thursday, 4 August 2022 at 14:45:26 UTC, Dennis wrote:
> In DMD, the generated getters/setters are `extern(C++)` so LDC 
> and GDC can access them from C++. This doesn't work with 
> opDispatch.

Will this work? It minimizes string mixins usage an has no 
`opDispatch`:

```d
     static struct S(E, T)
     {
         private T flags;

         private template Impl(T mask)
         {
             pure nothrow @nogc @safe final
             {
                 bool Impl(bool v)
	            {
     	            v ? (flags |= mask) : (flags &= ~mask);
         	        return v;
             	}

                 bool Impl() const scope
	            {
     	            return !!(flags & mask);
                 }
             }
         }

         static foreach (mem; __traits(allMembers, E))
             mixin("alias "~mem~" = Impl!(1 << E."~mem~");");
     }

     enum F { square,circle=5,triangle=7 }

     S!(F, ubyte) s;

     assert(s.square = true);
     assert(!(s.circle = false));
     assert(s.triangle = true);

     assert(s.square);
     assert(!s.circle);
     assert(s.triangle);
```


More information about the Digitalmars-d mailing list