Daniel Keep Wrote: > > > Burton Radons 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? > > Yeah, I've run into this before. I solved it at the time using CTFE and > string mixins: > > alias mixin(refDelegateFromTuple!(FieldTypes)) FieldTypesDg;
I couldn't quite figure out what you meant by this as DelegateFromTuple's not part of Phobos from what I can tell, but I did get this going: pure string BuildArguments (string prefix, T...) () { string text; foreach (type; T) { if (text.length) text ~= ", "; text ~= prefix ~ " "; text ~= type.stringof; } return text; } alias TypeTuple! (int, float) FieldTypes; mixin ("alias int delegate (" ~ BuildArguments! ("ref", FieldTypes) () ~ ") FieldTypesDeg;"); Seems to work fine, I just don't know whether "stringof" is going to be well-behaved here. Plus it's a little extra work for the compiler.