Thread overview
with not working wtih BitFlags
Jan 20, 2017
Jot
Re: With not working with BitFlags
Jan 20, 2017
Dukc
Jan 20, 2017
Dukc
Jan 20, 2017
Jot
January 20, 2017


struct EnumToFlags(alias E) {
	template opDispatch(string Name) {
		enum opDispatch = 1 << __traits(getMember, E, Name);
	};
};


enum X
{
a,b,c
}

auto q = EnumtoFlags!X;


auto m = q.a;

with(q)
{
   auto m = a;
}

a undefined.

Any way to get it to work? Maybe a full blowing string mixin is needed to generate the flag enum?



January 20, 2017
This is fairly complex thing, but I managed to get it working:

template EnumToFlags(E) if(is(E == enum))
{
    import std.traits, std.typecons, std.string;

    private static auto implementation()
    {
        string result;
        foreach(i, enumMem; EnumMembers!E)
        {
            result ~= format("enum %s = 1 << %s;\n", enumMem, i);
        }
        return result;
    }

    mixin(implementation);
};

enum X
{
    a,b,c
}

void main()
{
    alias q = EnumToFlags!X;

    with(q)
    {
       auto m = a;
    }
}

It may well be that with(x) only looks for x members, it probably does not try to look for templates. If so, opDispatch does not do the trick here. But the above does.
January 20, 2017
On Friday, 20 January 2017 at 09:12:04 UTC, Dukc wrote:
> template EnumToFlags(E) if(is(E == enum))
> {
>     import std.traits, std.typecons, std.string;
>
>     //...
> }

I think that typecons import was needless, you could try removing it...


January 20, 2017
On Friday, 20 January 2017 at 09:12:04 UTC, Dukc wrote:
> This is fairly complex thing, but I managed to get it working:
>
> template EnumToFlags(E) if(is(E == enum))
> {
>     import std.traits, std.typecons, std.string;
>
>     private static auto implementation()
>     {
>         string result;
>         foreach(i, enumMem; EnumMembers!E)
>         {
>             result ~= format("enum %s = 1 << %s;\n", enumMem, i);
>         }
>         return result;
>     }
>
>     mixin(implementation);
> };
>
> enum X
> {
>     a,b,c
> }
>
> void main()
> {
>     alias q = EnumToFlags!X;
>
>     with(q)
>     {
>        auto m = a;
>     }
> }
>
> It may well be that with(x) only looks for x members, it probably does not try to look for templates. If so, opDispatch does not do the trick here. But the above does.

Thanks.

That is basically what I was thinking and it does work.