template UDA

bitwise via Digitalmars-d digitalmars-d at puremagic.com
Mon Sep 7 16:14:59 PDT 2015


On Monday, 7 September 2015 at 22:03:13 UTC, Adam D. Ruppe wrote:
> On Monday, 7 September 2015 at 22:00:07 UTC, bitwise wrote:
>> Is there any real(and plausible) use case where providing a 
>> template with no argument as a UDA would be useful?
>
> Yes, you actually wrote it yourself!
>
>> @MyAttribute!SomeClass class SomeClass { }
>
> That right there is a reason. When you are looking for UDAs, 
> you look for declarations. The usage code looks like:
>


I kinda understand what you're saying, but I still don't think 
there is any benefit to tagging something with a template which 
has no type. The attribute in the above example doesn't need to 
be a template.

I imagine that if I were to search for a template UDA, the next 
step would probably be to enumerate the template parameters and 
take special action. Otherwise, the type is not needed. I suppose 
a template UDA could either have some args, or no args, but I 
can't imaging a use case where this would actually happen.

> foreach(member; getMembers!module)
>   if(member.hasUDA!(MyAttribute)) {
>       // do something
>   }
>
> The beauty of it is that member is right there! So your 
> reflection code could instantiate it right there:
>
>   // do something becomes...
>   MyAttribute!(member);
>
> so it instantiates the template with the given member in the 
> reflection code itself.

My goal is not to have this reflection code at all(the loop which 
looks through the module instantiating things). I want the 
attribute itself to do that.

Example:

struct Reflection {
     string typeName;
     string[] members;

     static Reflection[string] reflections;
}

struct Reflected(T)
{
     static this() {
         string[] members;

         foreach(memberName; __traits(allMembers, T))
         {
             members ~= memberName;
         }

         enum typeName = fullyQualifiedName!T.stringof[1..$-1];

         writeln("registering type: " ~ typeName);
         Reflection.reflections[typeName] = Reflection(typeName, 
members);
     }
}

Reflection* reflect(Object obj) {
     writeln("retrieving type for: " ~ typeid(obj).toString);
     return typeid(obj).toString in Reflection.reflections;
}

@Reflected!A class A {
     int x;
     float y;
     string z;
}

void main(string[] args)
{
     A a = new A();

     foreach(n; a.reflect.members)
         writeln(n);
}



But I would like to have the attribute pick up the type that's 
attached.

I saw an example, in another post that went something like this:

struct MyAttribute(T = _UDA_OBJECT_) { }

This would be acceptable too, but for some reason, the response 
received almost no attention.

    Bit



More information about the Digitalmars-d mailing list