proper way to find if attribute present?

Adam D. Ruppe destructionator at gmail.com
Thu Oct 24 10:58:37 PDT 2013


On Thursday, 24 October 2013 at 16:22:44 UTC, Daniel Davidson 
wrote:
> template hasAnnotation(alias f, Attr) {

This function looks for annotations as identified by type. 
Instead of using a plain string, you should make them some kind 
of struct:

struct MyAnnotation {
    string value;
}

Then you attach it like this:

@MyAnnotation("some value") void foo() {}

Then you'll be able to get it with the other two functions in 
there:

static if(hasValueAnnotation!(foo, MyAnnotation)) {
     pragma(msg, getAnnotation!(foo, MyAnnotation)); // prints 
MyAnnotation("some value")

     // or you can fetch it into a variable:
     MyAnnotation a = getAnnotation!(foo, MyAnnotation);
     assert(a.value == "some value");
}


It is possible to use plain string in place of the MyAnnotation 
struct:

  @("some value") void foo() {}

static if(hasValueAnnotation!(foo, string)) {
     pragma(msg, getAnnotation!(foo, string)); // prints 
MyAnnotation("some value")

     // or you can fetch it into a variable:
     string a = getAnnotation!(foo, string);
     assert(a == "some value");
}


But that isn't as reliable across modules because strings might 
be reused by anyone. A struct would always have a unique 
identifier - the struct name, which can be disambiguated by 
module.



More information about the Digitalmars-d-learn mailing list