Usability of "allMembers and derivedMembers traits now only return visible symbols"
Andrej Mitrovic via Digitalmars-d
digitalmars-d at puremagic.com
Tue Aug 30 17:16:51 PDT 2016
On 8/31/16, Ali Çehreli via Digitalmars-d <digitalmars-d at puremagic.com> wrote:
> v2.071.2-b3 is bringing a change for this bug:
>
> https://issues.dlang.org/show_bug.cgi?id=15907
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.
More information about the Digitalmars-d
mailing list