On Wednesday, 28 August 2019 at 20:56:25 UTC, Machine Code wrote:
I was writing a recursive function that uses template, I thought it would generate the proper template function on the fly to match the type in the parameter but it seems to not so so and try to use the called function, resulting in the error:

Error: function foo.serialize!(B).serialize(ref B output) is not callable using argument types (A) cannot pass argument output of type A to parameter ref B output Error: template instance `foo.serialize!(A)` error instantiating

Code:

void serialize(T)(ref T output)
{
        import std.traits : hasUDA, getUDAs, isAggregateType;
        import std.meta : Alias;
        
        foreach(fieldName; __traits(derivedMembers, T))
        {
                alias field = Alias!(__traits(getMember, T, fieldName));
                static if(isAggregateType!(typeof(field)))
                {
                        serialize!(typeof(field))(output);
                }
                static if(hasUDA!(field, Attr))
                {
                        enum className = getUDAs!(field, Attr)[0];
                        writefln("className = [%s]", className);
                }
        }
}

You're asking it to be the field type but passing it output.


    serialize!(typeof(field))(output);

Reply via email to