On Saturday, 3 October 2020 at 14:00:30 UTC, Adam D. Ruppe wrote:
On Saturday, 3 October 2020 at 13:10:31 UTC, realhet wrote:
I only managed to get the string[] by making a static foreach, but I don't know how to put that in an enum xxx = ...; statement.

There's always other ways but general rule: if you can get it one way, just wrap that up in a function and call that function for your enum initializer.

string[] your_function() {
     // implementation here you already have
     return it;
}

enum NodeNames = your_function();


Though with arrays btw `static immutable` tends to give better results than `enum` since it avoids extra allocations.

I tried it to put into a function:

auto getSymbolNamesByUDA(T, string uda)(){
    string[] res;
    static foreach(a; getSymbolsByUDA!(T, uda)) res ~= a.stringof;
    return res;
}

class Printer{
@("NODES") int gem1, gem2, gem3, gem4, gem5, head1, head2, head3, head4;
    alias Nodes = getSymbolsByUDA!(typeof(this), "NODES");
    enum NodeNames = getSymbolNamesByUDA!(typeof(this), "NODES");
}

void main(){
    static foreach(n; Printer.Nodes) n.stringof.writeln;
    Printer.NodeNames.writeln;
}

Up until this point, the alias declaration was before the enum declaration.
It gives an error:
Error: unknown, please file report on issues.dlang.org

But now I tried to comment out the alias declaration and it worked. It also works when I put the alias declaration after the enum:
    enum NodeNames = getSymbolNamesByUDA!(typeof(this), "NODES");
    alias Nodes = getSymbolsByUDA!(typeof(this), "NODES");

Same behavior with "static immutable".
My initial intention was to use the Nodes alias to get the name strings out of it. Now it needs more copy paste but it works.

This is weird o.O

Thank you!

Reply via email to