Dealing with raw types as attributes

Stanislav Blinov stanislav.blinov at gmail.com
Thu Nov 1 20:01:51 UTC 2018


On Thursday, 1 November 2018 at 16:14:45 UTC, Neia Neutuladh 
wrote:
> The spec says that a user-defined attribute must be an 
> expression, but DMD accepts a wide range of things as UDAs:
>
>   struct Foo { string name = "unknown"; }
>   @Foo int bar;
>
> `bar` has the *type* Foo as an attribute. It's not an 
> *instance* of Foo. So if I try to look at the UDAs:
>
>   static foreach (uda; __traits(getAttributes, bar))
>   {
>     static if (is(typeof(uda) == Foo))
>     {
>       pragma(msg, "bar is @Foo");
>     }
>   }
>
> That just doesn't work; typeof(Foo) isn't anything, so 
> is(typeof(Foo) == Foo) is false.
>
> I can change my code to read `static if (is(uda == Foo))`. But 
> that obviously fails:
>
>   @Foo("customName") int bar2;
>
> What do you do to handle this?

Check if an UDA is a type?.. As in, not just `is(uda == Foo)`, 
but simply `is(uda)`:

```
struct Foo { string name = "unknown"; }
@Foo @string @Foo("hello") int bar;

static foreach (uda; __traits(getAttributes, bar)) {
     static if (is(uda)) {
         // if `uda` is a type...
         static if (is(uda == Foo)) {
             pragma(msg, "bar is @Foo!!!");
         } else {
             pragma(msg, "bar is "~uda.stringof);
         }
     } else {
         // if `uda` is not a type...
         pragma(msg, "bar is "~uda.stringof);
     }
}
```


More information about the Digitalmars-d-learn mailing list