hasUDA with this
Timoses
timosesu at gmail.com
Fri Jul 20 06:03:38 UTC 2018
On Thursday, 19 July 2018 at 19:18:43 UTC, jmh530 wrote:
> I wanted to create a struct with a member function whose
> behavior was different depending on whether the struct instance
> had a particular UDA.
>
> 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?
>
>
>
> import std.traits : hasUDA;
>
> enum test;
>
> struct Foo
> {
> int x;
>
> bool checkUDA()
> {
> static if (hasUDA!(this, test))
> {
> return true;
> }
> else
> {
> return false;
> }
> }
> }
>
>
> void main()
> {
> import std.stdio : writeln;
>
> @test Foo foo = Foo(1);
> static assert(hasUDA!(foo, test));
>
> writeln(foo.checkUDA()); //prints false, expected true
> }
I haven't worked with UDAs myself yet, but I believe that when
you apply something like
@test Foo foo;
then you apply the UDA to `foo` and not to `Foo`.
See below:
enum test;
struct Foo
{}
bool checkUDA(alias f)()
{
static if (hasUDA!(f, test))
{
return true;
}
else
{
return false;
}
}
void main()
{
@test Foo foo;
// same as `hasUDA!(foo, test)`
assert(checkUDA!foo); //prints true
}
Now I'm really not sure how UDAs are best utilized, so above
example might not be how it should be done.. However, you could
make a templated version of checkUDA depending on what calls it.
E.g.
bool checkUDA(T, alias f)(T t)
{
// ...
}
although this leads to awkward calls like
foo.checkUDA!foo
which doesn't seem right either. Perhaps wait for somebody more
knowledgeable to answer your question : D.
More information about the Digitalmars-d-learn
mailing list