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