Thread overview | |||||
---|---|---|---|---|---|
|
February 13, 2020 How do you find the struct types in a module? - getting Error: unknown | ||||
---|---|---|---|---|
| ||||
Hi, I'm trying to get a typed list of structs in my current module that matches certain criteria. Something like: module mod; struct X {} struct Y {} alias allTypes = ListOfTypes!mod; But I'm having a bit of trouble. I have this so far: template ListOfTypes(alias T) { import std.meta; enum isStruct(string m) = is(mixin(m) == struct); enum types = Filter!(isStruct, __traits(allMembers, T)); alias toType(string m) = mixin(m); alias all = staticMap!(toType, types); alias CommandGroupsOf = all; } pragma(msg, ListOfTypes!mod); But that causes an error I've never seen before: Error: unknown, please file report on issues.dlang.org onlineapp.d(30,1): while evaluating `pragma(msg, CommandGroupsOf!(mod))` Any workarounds or maybe insight in to the error? |
February 13, 2020 Re: How do you find the struct types in a module? - getting Error: unknown | ||||
---|---|---|---|---|
| ||||
Posted in reply to aliak | On 2/13/20 9:47 AM, aliak wrote:
> Hi,
>
> I'm trying to get a typed list of structs in my current module that matches certain criteria. Something like:
>
> module mod;
>
> struct X {}
> struct Y {}
>
> alias allTypes = ListOfTypes!mod;
>
> But I'm having a bit of trouble. I have this so far:
>
> template ListOfTypes(alias T) {
> import std.meta;
> enum isStruct(string m) = is(mixin(m) == struct);
> enum types = Filter!(isStruct, __traits(allMembers, T));
> alias toType(string m) = mixin(m);
> alias all = staticMap!(toType, types);
> alias CommandGroupsOf = all;
> }
>
> pragma(msg, ListOfTypes!mod);
>
> But that causes an error I've never seen before:
>
> Error: unknown, please file report on issues.dlang.org
> onlineapp.d(30,1): while evaluating `pragma(msg, CommandGroupsOf!(mod))`
>
>
> Any workarounds or maybe insight in to the error?
>
>
Not sure about your error, but here is a working version (don't use mixins, use __traits(getMember)):
import std.meta;
template ListOfStructs(alias mod)
{
enum isStruct(string m) = is(__traits(getMember, mod, m) == struct);
alias getMember(string m) = __traits(getMember, mod, m);
alias ListOfStructs = staticMap!(getMember, Filter!(isStruct, __traits(allMembers, mod)));
}
-Steve
|
February 13, 2020 Re: How do you find the struct types in a module? - getting Error: unknown | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Thursday, 13 February 2020 at 15:38:37 UTC, Steven Schveighoffer wrote:
> On 2/13/20 9:47 AM, aliak wrote:
>>[...]
>
> Not sure about your error, but here is a working version (don't use mixins, use __traits(getMember)):
>
> import std.meta;
> template ListOfStructs(alias mod)
> {
> enum isStruct(string m) = is(__traits(getMember, mod, m) == struct);
> alias getMember(string m) = __traits(getMember, mod, m);
> alias ListOfStructs = staticMap!(getMember, Filter!(isStruct, __traits(allMembers, mod)));
> }
>
> -Steve
It works without the mixin indeed! Thank you!
|
Copyright © 1999-2021 by the D Language Foundation