Thread overview |
---|
March 23, 2015 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. |
March 23, 2015 Re: Template reference parameter | ||||
---|---|---|---|---|
| ||||
Posted in reply to rumbu Attachments: | 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)
>
> 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.
|
March 23, 2015 Re: Template reference parameter | ||||
---|---|---|---|---|
| ||||
Posted in reply to ketmar | On Monday, 23 March 2015 at 22:13:37 UTC, ketmar wrote:
> 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)
>>
>> 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.
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.
|
March 24, 2015 Re: Template reference parameter | ||||
---|---|---|---|---|
| ||||
Posted in reply to rumbu Attachments: | 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 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 pointers. |
March 24, 2015 Re: Template reference parameter | ||||
---|---|---|---|---|
| ||||
Posted in reply to rumbu | 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 |
March 24, 2015 Re: Template reference parameter | ||||
---|---|---|---|---|
| ||||
Posted in reply to weaselcat Attachments: | On Tue, 24 Mar 2015 00:54:12 +0000, weaselcat wrote:
> 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
nope, that is not what OP wants. OP's wish is impossible, due to `ref` not being a part of a type.
|
Copyright © 1999-2021 by the D Language Foundation