digitalmars.D.learn - with not working wtih BitFlags
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?
 Jan 19 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.
 Jan 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...
 Jan 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.
 Jan 20 2017








 
 
 
 Dukc <ajieskola gmail.com> 