On Thursday, 19 July 2018 at 19:18:43 UTC, jmh530 wrote:
However, it seems like hasUDA doesn't seem to produce the result I would have expected here. I tried using getAttributes, but that didn't work either.

Am I missing something, or should I submit an enhancement request?

UDAs apply to symbols. When you pass something to a function, the symbol does not go with the value, and thus that UDA goes away. It's similar to assigning to a different variable:

    import std.traits : hasUDA;
    @("foo")
    Foo foo1;
    Foo foo2 = foo1;
    assert(!hasUDA!(foo2, "foo"));

Since UDAs are compile-time constructs, they really can't follow values around in that way. Consider:

void main(string[] args) {
    @("foo")
    Foo foo1;
    @("bar")
    Foo foo2;
    Foo foo3 = (args.length % 2) ? foo1 : foo2;
assert(hasUDA!(foo3, "foo")); // Would you expect this to pass or fail?
}

Timoses first checkUDA function is exactly what I would suggest you use.

--
  Simen

Reply via email to