How to manage function's parameter storage class?

Sobaya sobaya007 at gmail.com
Sat Jan 20 14:31:59 UTC 2018


I'm using opDispatch for wrapping a function like below.

```
import std.stdio;

void func(ref int x, int y) {
     x++;
}

struct B {
     // wraps 'func'. I want to implement this function.
     template opDispatch(string fn) {
         void opDispatch(Args...)(Args args) {
             mixin(fn~"(args);"); // func(args);
         }
     }
}

void main() {
     {
         // This is good behavior.
         int x = 3;
         func(x, 1);
         writeln(x);   // prints '4'
     }
     {
         // This is bad behavior.
         B b;
         int x = 3;
         b.func(x, 1);
         writeln(x);   // prints '3' because x is copied when 
passed to opDispatch.
     }

}
```

How can I wrap function whose arguments contain both ref and 
normal like 'func' ?
With normal 'Args', x is not increased because x is copied when 
passed to opDispatch.
If I write 'ref Args' in opDispatch's argument, it fails because 
second parameter is not rvalue.


More information about the Digitalmars-d-learn mailing list