Thread overview | |||||
---|---|---|---|---|---|
|
January 20, 2018 How to manage function's parameter storage class? | ||||
---|---|---|---|---|
| ||||
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 Re: How to manage function's parameter storage class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sobaya | 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 Re: How to manage function's parameter storage class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Simen Kjærås | 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! !
|
Copyright © 1999-2021 by the D Language Foundation