Thread overview
Template reference parameter
Mar 23, 2015
rumbu
Mar 23, 2015
ketmar
Mar 23, 2015
rumbu
Mar 24, 2015
ketmar
Mar 24, 2015
weaselcat
Mar 24, 2015
ketmar
March 23, 2015
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
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
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
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
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
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.