On 01/25/2018 11:49 AM, JN wrote:

         foreach (i, member; FieldNameTuple!T)
         {
             if (!hasUDA!(member, "noserialize"))
             {
                 writeln(member);
             }

'member' is a string local variable, which does not have that UDA. You need to get the symbol of the struct:

            if (!hasUDA!(__traits(getMember, T, member), "noserialize"))
            {
                writeln(member);
            }

However, note that you're using a compile-time foreach, which expands its body for each iteration. Since you used a regular if, you have three checks at runtime.

What you really want is use a 'static if':

static if (!hasUDA!(__traits(getMember, T, member), "noserialize"))
            {
                writeln(member);
            }

Aaah... Much lighter... :)

Even further, you may want to consider using a 'static foreach':

        static foreach (i, member; FieldNameTuple!T)
        {
            // ...
        }

That is more powerful because it can iterate over more ranges. However there are some differences from the regular foreach: For example, 'static foreach' does not introduce a scope per iteration.

Ali

Reply via email to