On Sunday, 30 April 2017 at 20:05:59 UTC, Kevin Balbas wrote:
I've got the following code snippet, which almost does what I want.

struct TaggedType {}

@TaggedType
struct Foo {}

@TaggedType
struct Bar {}

string GenerateTypeEnum()
{
    string enumString = "enum TypeEnum {";
    foreach (name; __traits(allMembers, mixin(__MODULE__)))
    {
        import std.traits;
        static if (hasUDA!(mixin(name), TaggedType))
        {
            enumString ~= name;
            enumString ~= "Type,";
        }
    }
    enumString ~= "}";
    return enumString;
}

// generates enum TypeEnum {FooType,BarType,}
mixin(GenerateTypeEnum());

This works great, except that TypeEnum isn't accessible from other modules (undefined identifier 'TypeEnum'), which is kind of the point of doing this (I'm using the enum as a system-wide tag for inter-thread communication). I can imagine why this would be the case, but it's a pretty serious problem. Is there a way to do this?

if i put your sniped in b.d and import in a.d b then i'm able to access TypeEnum. You r problem must be something stupid that's not related to UDA/mixins.

That leads to this question (sorry) but at least do you import the module that contains TypeEnum ?

Reply via email to