www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Aliases and UDA's

reply Manu via Digitalmars-d <digitalmars-d puremagic.com> writes:
I've got this thing going on where I want to be able to attribute an
alias, but that doesn't seem to work:

 ("hello")
struct(X) S
{
  X x;
}

 ("world")
alias A = S!int;

Test!A;

template(T) Test
{
  // at this point, if T is some S, then the "hello" attribute is
present, as expected
  // if T is A, "world" is lost
}

I guess the reason is that A is not really a thing; it is translated
to S!int when being given to T?
Is that the point where "world" is lost?

I'm not really sure how I can achieve what I want here... I need to
attribute particular instantiations of a template struct as shown.
Dec 29 2014
next sibling parent reply "Daniel Murphy" <yebbliesnospam gmail.com> writes:
"Manu via Digitalmars-d"  wrote in message 
news:mailman.3785.1419919315.9932.digitalmars-d puremagic.com...

 I guess the reason is that A is not really a thing; it is translated
 to S!int when being given to T?
 Is that the point where "world" is lost?
Yes. "world" is still there, but you can't actually get the symbol A.
 I'm not really sure how I can achieve what I want here... I need to
 attribute particular instantiations of a template struct as shown.
Why does it have to be UDAs? You can easily put the 'attributes' inside S or define a template for getting the attributes from an arbitrary S. Something like: enum myAttributes(T : S!int) = TypeTuple!("world"); enum myAttributes(T : S!U, U) = TypeTuple!();
Dec 30 2014
parent Manu via Digitalmars-d <digitalmars-d puremagic.com> writes:
On 30 December 2014 at 22:51, Daniel Murphy via Digitalmars-d
<digitalmars-d puremagic.com> wrote:
 "Manu via Digitalmars-d"  wrote in message
 news:mailman.3785.1419919315.9932.digitalmars-d puremagic.com...

 I guess the reason is that A is not really a thing; it is translated
 to S!int when being given to T?
 Is that the point where "world" is lost?
Yes. "world" is still there, but you can't actually get the symbol A.
 I'm not really sure how I can achieve what I want here... I need to
 attribute particular instantiations of a template struct as shown.
Why does it have to be UDAs? You can easily put the 'attributes' inside S or define a template for getting the attributes from an arbitrary S. Something like: enum myAttributes(T : S!int) = TypeTuple!("world"); enum myAttributes(T : S!U, U) = TypeTuple!();
In this particular case, I'm actually attributing pixel structures with an enum that describes the pixel format to a 3rd party library. I can approach it differently, but it was just a particularly convenient and un-intrusive way to get the data through to the 3rd party API. It seemed nicer as an attribute; if I pollute the type with the 3rd party enum by making it a template arg or something, then my type can't exist on its own without knowledge of the particular 3rd party lib. Like, it would expect to be given this enum to instantiate, and that's unnecessary restrictive. I guess I'll have to explore some alternatives.
Dec 30 2014
prev sibling parent reply Jacob Carlborg <doob me.com> writes:
On 2014-12-30 07:01, Manu via Digitalmars-d wrote:
 I've got this thing going on where I want to be able to attribute an
 alias, but that doesn't seem to work:

  ("hello")
 struct(X) S
 {
    X x;
 }

  ("world")
 alias A = S!int;

 Test!A;

 template(T) Test
 {
    // at this point, if T is some S, then the "hello" attribute is
 present, as expected
    // if T is A, "world" is lost
 }

 I guess the reason is that A is not really a thing; it is translated
 to S!int when being given to T?
 Is that the point where "world" is lost?
What if you make T an alias parameter, will that work? -- /Jacob Carlborg
Dec 31 2014
parent Manu via Digitalmars-d <digitalmars-d puremagic.com> writes:
I tried that. It doesn't work.
It's also not really what I want.
On 31/12/2014 9:35 pm, "Jacob Carlborg via Digitalmars-d" <
digitalmars-d puremagic.com> wrote:

 On 2014-12-30 07:01, Manu via Digitalmars-d wrote:

 I've got this thing going on where I want to be able to attribute an
 alias, but that doesn't seem to work:

  ("hello")
 struct(X) S
 {
    X x;
 }

  ("world")
 alias A = S!int;

 Test!A;

 template(T) Test
 {
    // at this point, if T is some S, then the "hello" attribute is
 present, as expected
    // if T is A, "world" is lost
 }

 I guess the reason is that A is not really a thing; it is translated
 to S!int when being given to T?
 Is that the point where "world" is lost?
What if you make T an alias parameter, will that work? -- /Jacob Carlborg
Dec 31 2014