www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 1411] New: ref Tuple should transform to Tuple of ref's


           Summary: ref Tuple should transform to Tuple of ref's
           Product: D
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: hhasemann web.de

The following code does not compile because the delegate in the (*) row
expands to
int delegate(ref (int, char[], real)) dg;
more useful would be:
int delegate(ref int, ref char[], ref real) dg;
this way you could define opApplys parameters by template parameters
which is useful for stuff like iterators in "template libraries".

The workaround I currently use is also provided her.

Code that does not compile because of the problem described above
template Tuple(T ...) { alias T Tuple; }

int delegate(ref Tuple!(int, char[], real)) dg; // (*)

int f(ref int a, ref char[] b, ref real c) { return 77; }

void main() {
  dg = &f;

My workaround
import std.traits
 * Given the types T create a delegate with return type int and parameter
 * types ref T.
 * Example:
 * TupleDelegate!(int, char[], void*) dg;
 * is equivalent to:
 * int delegate(ref int, ref char[], ref void*) dg;
template TupleDelegate(T ...) {
  alias MkDelegate!(int delegate(), T) TupleDelegate;

 * Helper for TupleDelegate.
 * Parameters:
 * D: accumulated delegate
 * A, B: Types to append to D's parameter list
template MkDelegate(D, A, B ...) {
  alias MkDelegate!(int delegate(ParameterTypeTuple!(D), ref A), B) MkDelegate;

 * Ditto
template MkDelegate(D, A) {
  alias int delegate(ParameterTypeTuple!(D), ref A) MkDelegate;

Aug 10 2007