www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - __traits with alias

reply "sigod" <sigod.mail gmail.com> writes:
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 07 2014
parent reply Philippe Sigaud via Digitalmars-d-learn writes:
          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 08 2014
parent "sigod" <sigod.mail gmail.com> writes:
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.
May 08 2014