Thread overview |
---|
January 20, 2017 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? |
January 20, 2017 Re: With not working with BitFlags | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jot | 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 Re: With not working with BitFlags | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dukc | 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 Re: With not working with BitFlags | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dukc | 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.
|
Copyright © 1999-2021 by the D Language Foundation