On Thursday, 17 April 2014 at 09:39:01 UTC, evilrat wrote:
Greetings,

it is possible to put function as attribute, but is this possible to get "subject" of UDA's? so combining both could we should get something like this:
----------------
// module scope or static struct member
int[Variant] values; // should be typeinfo?

void registerStructVal(alias val)()
{
alias symbol = ... some pragma or trait to get struct S ... // not any yet?
  static if ( is(symbol == struct) )
  {
    values[val] = Variant(symbol);
  }
}

@(registerStructVal!42())
struct S {}

@(registerClassVal!3())
class C
{
int x;
this(int val) { x = val; }
}


void main()
{
writeln(values); // 42 = S, 3 = C
auto a = values[3](123); // ok for class there typeinfo.create, but how to call specific ctor using it?
writeln(a.x) // 123
}
----------------

it may be hacked some way like defining any specific UDA as tag, use module ctor or template to inject code into structs with that tag, or maybe other ways which would be intrusive. what i'm looking for is to be able declare such function/template non-intrusive way.

Theres no way right now to grab the type that a UDA is on.
The only way I know how that is 100% going to work is:

struct S(alias T) {
        alias T me;
}

@S!(x)
int x;

void main() {
        assert(x == 0);
        __traits(getAttributes, x)[0].me = 5;
        assert(x == 5);
}

There may be another way.. But its not nice. By far. And thats to
parse allMembers (not really reasonable).

Either way I say, we need a new trait for this. Perhaps given
that UDA's shouldn't be classes that we could repurpose parent
for this as it kinda make sense imho.

Reply via email to