Thread overview
How to manage function's parameter storage class?
Jan 20, 2018
Sobaya
Jan 20, 2018
Simen Kjærås
Jan 20, 2018
Sobaya
January 20, 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.
January 20, 2018
On Saturday, 20 January 2018 at 14:31:59 UTC, Sobaya wrote:
> 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.

https://dlang.org/spec/function.html#auto-ref-functions

Simply put, instead of 'ref' use 'auto ref'.

--
  Simen
January 20, 2018
On Saturday, 20 January 2018 at 17:05:40 UTC, Simen Kjærås wrote:
> On Saturday, 20 January 2018 at 14:31:59 UTC, Sobaya wrote:
>> 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.
>
> https://dlang.org/spec/function.html#auto-ref-functions
>
> Simply put, instead of 'ref' use 'auto ref'.
>
> --
>   Simen

Oh... I missed it...
Thanks! !