digitalmars.D.learn - Template reference parameter
I'm trying to construct a struct template where one of the template parameters is passed by reference (as option) struct S(T, U) { void opCall(T t, U u) { } } alias X = S!(T, U); alias RX = S!(T, ref U); //not working The objective is to call X(t, u) or RX(t, u), but in second case I want "u" to be passed by reference. The only solution I found is to pass U as a pointer or as a class.
Mar 23 2015
On Mon, 23 Mar 2015 22:01:03 +0000, rumbu wrote:I'm trying to construct a struct template where one of the template parameters is passed by reference (as option) =20 struct S(T, U) { void opCall(T t, U u) { } } =20 alias X =3D S!(T, U); alias RX =3D S!(T, ref U); //not working =20 The objective is to call X(t, u) or RX(t, u), but in second case I want "u" to be passed by reference. =20 The only solution I found is to pass U as a pointer or as a class.`ref` is not a part of a type, so you can't do it like this. you have to=20 have two different templates for that. or try to use `auto ref`, it may=20 help.=
Mar 23 2015
On Monday, 23 March 2015 at 22:13:37 UTC, ketmar wrote:On Mon, 23 Mar 2015 22:01:03 +0000, rumbu wrote:I have only one template and I think it's impossible to define specializations since it's supposed that a random member of A... will be passed sometime by reference: struct MulticastDelegate(ReturnType, A...) { //... ReturnType opCall(A args) { //... } } Here it's what I have right now: alias SomeDelegateWithInt = MulticastDelegate!(bool, char, int); alias SomeDelegateWithRefInt = MulticastDelegate!(bool, char, int*); SomeDelegateWithInt d1; SomeDelegateWithRefInt d2; ... int value; bool b = d1('a', value); bool b = d2('b', &value); It's working, but I don't like the &value thing, ref would be better.I'm trying to construct a struct template where one of the template parameters is passed by reference (as option) struct S(T, U) { void opCall(T t, U u) { } } alias X = S!(T, U); alias RX = S!(T, ref U); //not working The objective is to call X(t, u) or RX(t, u), but in second case I want "u" to be passed by reference. The only solution I found is to pass U as a pointer or as a class.`ref` is not a part of a type, so you can't do it like this. you have to have two different templates for that. or try to use `auto ref`, it may help.
Mar 23 2015
On Mon, 23 Mar 2015 22:39:27 +0000, rumbu wrote:It's working, but I don't like the &value thing, ref would be better.alas. you can write a complex mixin that will generate the appropriate=20 templates for you, though, so you'll be able to do something like this: mixin(MulticastDelegate!(`withRefInt`, `bool`, `char`, `ref int`)); but it will be error-prone and ugly. so the best thing is to stick with=20 pointers.=
Mar 23 2015
On Monday, 23 March 2015 at 22:39:28 UTC, rumbu wrote:I have only one template and I think it's impossible to define specializations since it's supposed that a random member of A... will be passed sometime by reference:auto ref? http://dlang.org/template.html#auto-ref-parameters
Mar 23 2015
On Tue, 24 Mar 2015 00:54:12 +0000, weaselcat wrote:On Monday, 23 March 2015 at 22:39:28 UTC, rumbu wrote: =20nope, that is not what OP wants. OP's wish is impossible, due to `ref`=20 not being a part of a type.=I have only one template and I think it's impossible to define specializations since it's supposed that a random member of A... will be passed sometime by reference:=20 auto ref? http://dlang.org/template.html#auto-ref-parameters
Mar 23 2015