UDA syntax

Ali Çehreli acehreli at yahoo.com
Wed Jan 16 22:55:57 PST 2013


On 01/16/2013 09:45 PM, Era Scarecrow wrote:

 > (Do they have to be structs?) If they
 > don't and you add code, can that code help/add or modify the attributed
 > object (or can it at all?).

It looks like some mixin magic can be used.

 > Do the structs have to be empty?

They can have members. getAttributes preserves the types and values of 
the attributes. It returns a tuple.

With the warning that I don't have any experience with attributes, the 
following program uses an attribute type that has a member to indicate 
the number of times that a variable must be serialized. (Stupid idea. :))

import std.stdio;

struct Serialize
{
     size_t count;
}

struct S
{
     @Serialize(3) int x;
     int y;
     @Serialize(2) int z;
}

void foo(T)(T s)
{
     foreach (member; __traits(allMembers, T)) {
         foreach (attr;
                  __traits(getAttributes, mixin(T.stringof ~ '.' ~ 
member))) {
             if (typeid(attr) is typeid(Serialize)) {
                 writefln("%s has %s", member, attr);
                 writefln("must serialize %s %s times", member, attr.count);

                 foreach (count; 0 .. attr.count) {
                     writefln("  serializing %s", member);
                 }
             }
         }
     }
}

void main()
{
     auto s = S();
     foo(s);
}

The output shows that only x and z are serialized according to their 
respective serialization counts:

x has Serialize(3)
must serialize x 3 times
   serializing x
   serializing x
   serializing x
z has Serialize(2)
must serialize z 2 times
   serializing z
   serializing z

Ali



More information about the Digitalmars-d-learn mailing list