www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to define variadic delegate with a ref/out argument?

reply pham <home home.com> writes:
struct DelegateList(Args...)
{
public:
     alias DelegateHandler = void delegate(Args args) nothrow;

     DelegateHandler[] items;

     void opCall(Args args) nothrow
     {
         foreach (i; items)
             i(args);
     }
}

DelegateList!(string, int) list; // Compile OK so far
DelegateList!(string, int*) list2; // Compile OK so far
DelegateList!(string, ref int) list3; // Compile error -> How to 
make it work?

Thanks
Pham
Nov 16 2017
parent reply Jerry A. <Labuurii gmail.com> writes:
On Friday, 17 November 2017 at 05:08:23 UTC, pham wrote:
 struct DelegateList(Args...)
 {
 public:
     alias DelegateHandler = void delegate(Args args) nothrow;

     DelegateHandler[] items;

     void opCall(Args args) nothrow
     {
         foreach (i; items)
             i(args);
     }
 }

 DelegateList!(string, int) list; // Compile OK so far
 DelegateList!(string, int*) list2; // Compile OK so far
 DelegateList!(string, ref int) list3; // Compile error -> How 
 to make it work?

 Thanks
 Pham
The only way I know of is using a template which behaves like a reference. Which can be done with nullableRef I suppose. Haven't actually tried it. import std.typecons : NullableRef, nullableRef; DelegateList!(NullableRef!int)(nullableRef(some_int));
Nov 16 2017
parent pham <home home.com> writes:
On Friday, 17 November 2017 at 06:21:50 UTC, Jerry A. wrote:
 On Friday, 17 November 2017 at 05:08:23 UTC, pham wrote:
 struct DelegateList(Args...)
 {
 public:
     alias DelegateHandler = void delegate(Args args) nothrow;

     DelegateHandler[] items;

     void opCall(Args args) nothrow
     {
         foreach (i; items)
             i(args);
     }
 }

 DelegateList!(string, int) list; // Compile OK so far
 DelegateList!(string, int*) list2; // Compile OK so far
 DelegateList!(string, ref int) list3; // Compile error -> How 
 to make it work?

 Thanks
 Pham
The only way I know of is using a template which behaves like a reference. Which can be done with nullableRef I suppose. Haven't actually tried it. import std.typecons : NullableRef, nullableRef; DelegateList!(NullableRef!int)(nullableRef(some_int));
nullableRef is same as passing pointer. Using "ref" is stronger guarantee that the var is never be passed as null. variadic parameter passed by "ref" should be supported Thanks. Pham
Nov 19 2017