Re: With not working with BitFlags
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.
Re: With not working with BitFlags
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...
Re: With not working with BitFlags
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.