June 27, 2015
I try to build a symbol table:

---
module aveb;

import std.stdio;
import std.algorithm.searching;
import std.ascii;

void* [string] sig;

void ana(alias mod)()
{
    import std.traits;
    foreach(memb;__traits(allMembers,mod))
    static if (canFind(["package","public"],__traits(getProtection,memb)))
        static if (isSomeFunction! (__traits(getMember,mod,memb) ))
            foreach(ov;__traits(getOverloads,mod,memb))
                sig[memb] = &__traits(getMember,mod,memb);
}

void main(string[] args)
{
    //ana!(std.ascii); //ok
    ana!(std.traits);
    writeln(sig);
}
---

>Error: function std.traits.demangleParameterStorageClass is not accessible from module aveb
>Error: function std.traits.demangleParameterStorageClass is not accessible from module aveb
>etc


problem is that the sub functions are not accessible. i'd like to skip them.




June 27, 2015
On Sat, 27 Jun 2015 16:28:40 +0000, BBaz wrote:

> I try to build a symbol table:
> 
> ---
> module aveb;
> 
> import std.stdio;
> import std.algorithm.searching;
> import std.ascii;
> 
> void* [string] sig;
> 
> void ana(alias mod)()
> {
>      import std.traits; foreach(memb;__traits(allMembers,mod))
>      static if
> (canFind(["package","public"],__traits(getProtection,memb)))
>          static if (isSomeFunction! (__traits(getMember,mod,memb)
> ))
>              foreach(ov;__traits(getOverloads,mod,memb))
>                  sig[memb] = &__traits(getMember,mod,memb);
> }
> 
> void main(string[] args)
> {
>      //ana!(std.ascii); //ok ana!(std.traits);
>      writeln(sig);
> }
> ---
> 
>>Error: function std.traits.demangleParameterStorageClass is not accessible from module aveb Error: function std.traits.demangleParameterStorageClass is not accessible from module aveb etc
> 
> 
> problem is that the sub functions are not accessible. i'd like to skip them.

wrap your code in another static if:

static if (is(typeof(__traits(getMember, mod, memb)))) { ... }

`is()` gags errors and simply returns `false` for invalid cases.