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).