On Sun, Feb 8, 2009 at 4:25 PM, Burton Radons <burton.rad...@gmail.com> wrote:
> I'm writing a couple of modules for dealing with database values (well really 
> it's just storage of aggregates) in a native fashion from within D, using D 
> 2.023. I have a tuple called FieldTypes which contains the D-side types. I'm 
> trying to use it to implement opApply:
>
>    int opApply (int delegate (FieldTypes) func)
>
> Unfortunately, this fails because the compiler only accepts the field types 
> if they're references. But if I do this:
>
>    int opApply (int delegate (ref FieldTypes) each)
>
> It seems that the delegate takes a reference to one type, which is a value 
> tuple! For example it claims that, simplified, "function Table.opApply (int 
> delegate (ref (string, string)) each) does not match parameter types (int 
> delegate (ref string, ref string))".
>
> I've already implemented another opApply that takes a Line containing all the 
> fields, but I'd like to have the expanded form as well if possible. Is it?
>

Strangely, if you have a function which takes a ref tuple parameter,
it works as you'd expect:

void initialize(T...)(ref T args)
{
    foreach(arg; args)
        arg = arg.init;
}

void main()
{
    int x;
    float y;
    initialize(x, y); // fine
}

I think I had some trouble getting the compiler to eat opApplies that
did fancy stuff like this.  I ended up just doing int opApply(T)(T
dg).

Reply via email to