UDA usage

Matt Soucy msoucy at csh.rit.edu
Fri Oct 4 20:50:42 PDT 2013


On 10/04/2013 11:04 PM, Adam D. Ruppe wrote:
> On Saturday, 5 October 2013 at 02:51:21 UTC, Matt Soucy wrote:
>> * Check to see if a specific attribute exists
>> * Check to see if an attribute of a specific type exists, something like:
> 
> The helper functions from my web.d might help:
> 
> // checks to see if it has one of a type
> // static if(hasAnnotation!(func, Foo)) { has @Foo }
> // use if Foo is a simple enum.
> template hasAnnotation(alias f, Attr) {
>     bool helper() {
>         foreach(attr; __traits(getAttributes, f))
>             static if(is(attr == Attr) || is(typeof(attr) == Attr))
>                 return true;
>         return false;
> 
>     }
>     enum bool hasAnnotation = helper;
> }
> 
> /// checks to see if it has an annotation with a value e.g. @Something(10)
> template hasValueAnnotation(alias f, Attr) {
>     bool helper() {
>         foreach(attr; __traits(getAttributes, f))
>             static if(is(typeof(attr) == Attr))
>                 return true;
>         return false;
> 
>     }
>     enum bool hasValueAnnotation = helper;
> }
> 
> /// gets the thing you checked for above. so getAnnotation!(Func,
> Something) returns Something(10) (if Something is as struct)
> template getAnnotation(alias f, Attr) if(hasValueAnnotation!(f, Attr)) {
>     auto helper() {
>         foreach(attr; __traits(getAttributes, f))
>             static if(is(typeof(attr) == Attr))
>                 return attr;
>         assert(0);
>     }
> 
>     enum getAnnotation = helper;
> }
> 
> 

Nice, thank you. These are really helpful!

>> * Create a function that can only be called if the first argument has a
>> UDA of a specific type
> 
> Since the UDA is only available at compile time, you can't do that
> without some kind of template.

Using the above tools I got what I wanted, so I'm satisfied for now.
Thank you, though!
-Matt Soucy


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20131004/14300795/attachment.pgp>


More information about the Digitalmars-d-learn mailing list