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.

Reply via email to