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.

Reply via email to