Thread overview
__traits with alias
May 08, 2014
sigod
May 08, 2014
Philippe Sigaud
May 09, 2014
sigod
May 08, 2014
void registerAll(alias module_)()
{
     foreach (m; __traits(derivedMembers, module_)) {
         regInner!(__traits(getMember, module_, m)); // compiles

         alias a = __traits(getMember, module_, m); // fails
         //Error: basic type expected, not __traits
         //Error: semicolon expected to close alias declaration
     }
}

void regInner(alias T)()
{
     // ...
}

Is this a bug or I've missed something?
May 08, 2014
>          alias a = __traits(getMember, module_, m); // fails
>          //Error: basic type expected, not __traits
>          //Error: semicolon expected to close alias declaration

> Is this a bug or I've missed something?

It's a syntax limitation for alias. That bites us from time to time. A workaround is to wrap it into another template, to 'hide' __traits.

Like this:

alias Alias(alias a) = a; // A bit circular, I know.

void registerAll(alias module_)()
{
     foreach (m; __traits(derivedMembers, module_)) {
         regInner!(__traits(getMember, module_, m));

         alias a = Alias!(__traits(getMember, module_, m)); // compiles
     }
}

void regInner(alias T)()
{
     // ...
}

void main(){}


I think there is bug report / enhancement for this. I find it a bit annoying, since aliasing a __traits expression is quite common.
May 09, 2014
On Thursday, 8 May 2014 at 07:33:34 UTC, Philippe Sigaud via Digitalmars-d-learn wrote:
> A workaround is to wrap it into another template, to 'hide' __traits.
>
> Like this:
>
> alias Alias(alias a) = a; // A bit circular, I know.
Oh, thank you.

> I think there is bug report / enhancement for this. I find it a bit
> annoying, since aliasing a __traits expression is quite common.
This one https://issues.dlang.org/show_bug.cgi?id=7804, I believe.