Using __traits(getMember...) in alias statement

Timon Gehr timon.gehr at gmx.ch
Thu Nov 17 09:41:37 PST 2011


On 11/17/2011 06:12 PM, Tobias Pankrath wrote:
> It would be cool, if the following would be possible.
> ----
> immutable string MemberID = "M";
>
> struct A {}
> struct B {
>      alias A M;
> }
>
> template Member(T)
> {
>      static if(__traits(hasMember, T, MemberID))
>      {
>          alias __traits(getMember, T, MemberID) Member;
>      }
>      else
>          alias TypeTuple!() Member;
> }
>
> void main()
> {
>      alias Member!(B) M;
> }
> ----
>
> Currently dmd will print "basic type expected, not __traits".
> Why isn't traits allowed here and if we allow __traits there, would this
> introduce any ambiguities?
>

This works:

alias TypeTuple!(__traits(getMember, T, MemberID)) Member;

It is a mere grammar issue. The aliased symbol must look like a valid 
type. I'd like that to change too.

This helps a lot with the current state of affairs:

template ID(alias x){alias x ID;}


It will even allow funny things like this:

alias ID!((a,b){return a+b;}) add;

static assert(add(1,2) == 3);


More information about the Digitalmars-d-learn mailing list