digitalmars.D.learn - How to define variadic delegate with a ref/out argument?
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
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 PhamThe 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
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: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. Phamstruct 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 PhamThe 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 19 2017