Usability of "allMembers and derivedMembers traits now only return visible symbols"

Jacob Carlborg via Digitalmars-d digitalmars-d at puremagic.com
Tue Aug 30 23:48:25 PDT 2016


On 2016-08-31 02:16, Andrej Mitrovic via Digitalmars-d wrote:

> PSA: If all one cares about are UDAs for fields and not functions then
> .tupleof is still a viable workaround. Working example:
>
> -----
> import getSymbols;
>
> enum UDA;
>
> struct S
> {
>     @UDA float visible;
>
>     float dont_care;
>
>     private @UDA int invisible;
> }
>
> void main()
> {
>     static assert(getSymbolsByUDA!(S, UDA).length == 2);
>     static assert(getSymbolsByUDA!(S, UDA).stringof == "tuple(visible,
> invisible)");
> }
> -----
>
> -----
> module getSymbols;
>
> import std.meta : AliasSeq;
> import std.traits : staticIndexOf;
>
> template getSymbolsByUDA ( T, alias uda )
> {
>     alias getSymbolsByUDA = getSymbolsByUDAImpl!(T, uda);
> }
>
> template getSymbolsByUDAImpl ( T, alias uda, size_t idx = 0 )
> {
>     static if (idx + 1 < T.tupleof.length)
>     {
>         static if (hasUDA!(T.tupleof[idx], uda))
>             alias Field = AliasSeq!(T.tupleof[idx]);
>         else
>             alias Field = AliasSeq!();
>
>         alias getSymbolsByUDAImpl = AliasSeq!(Field,
>             getSymbolsByUDAImpl!(T, uda, idx + 1));
>     }
>     else
>     {
>         static if (hasUDA!(T.tupleof[idx], uda))
>             alias getSymbolsByUDAImpl = AliasSeq!(T.tupleof[idx]);
>         else
>             alias getSymbolsByUDAImpl = AliasSeq!();
>     }
> }
>
> template hasUDA ( alias field, alias uda )
> {
>     enum hasUDA = staticIndexOf!(uda, __traits(getAttributes, field)) != -1;
> }
> -----
>
> This is the reason msgpack-d still works and wasn't broken by the change.

Ah, nice workaround. Last time I tried to use __traits(getAttributes) 
with a "tupleof expression" it didn't work.

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list