how to achieve C's Token Pasting (##) Operator to generate variable name in D?

mw mingwu at gmail.com
Sun May 31 20:00:00 UTC 2020


On Sunday, 31 May 2020 at 09:37:24 UTC, Ali Çehreli wrote:
> On 5/31/20 2:26 AM, Ali Çehreli wrote:
>
> Ok, I solved that too with a very convoluted "eponymous mixin 
> template opDispatch." :)
>
> struct RW(T) {
>   template opDispatch(string name) {
>     static codeImpl() {
>       import std.format;
>
>       return format!q{
>         private %s _%s;
>         public auto %s() { return _%s; }
>         public auto %s(%s val) { _%s = val; return this; }
>       }(T.stringof, name,
>         name, name,
>         name, T.stringof, name);
>     }
>
>     mixin template opDispatch(alias code = codeImpl()) {
>       mixin (code);
>     }
>   }
> }
>
> struct Point {
>   mixin RW!int.x;    // <-- NICE :)
>   mixin RW!int.y;
>     // etc.
> }
>
> import std.traits;
> import std.stdio;
>
> void main() {
>   pragma(msg, FieldNameTuple!(Point));
>
>   auto p = Point(1, 2);
>   p.x = 42;
>   p.y = 43;
>   writeln(p);
> }
>
> Ali


Thank you all for the refinement.

One question: in Sebastiaan's solution opDispatch is performed at 
run-time, how efficient is the D runtime's implementation of 
opDispatch compared with a direct regular method call (or a 
virtual method call in general):
```
   public  final  int  x()      {return _x;}  // in this example 
it can be final
```

In short, while I want to reduce the boilerplate code I have to 
write, I don't want to pay any extra run-time cost; compile-time 
cost is fine.


@Ali in your solution, opDispatch is also performed at run-time 
instead of compile-time (I'm not sure)? since it's inside struct 
RW, (each x, y is actually a struct inside Point)?




More information about the Digitalmars-d-learn mailing list