Template reference parameter

rumbu via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Mar 23 15:39:27 PDT 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.



More information about the Digitalmars-d-learn mailing list