Re: With not working with BitFlags

2017-01-20 Thread Jot via Digitalmars-d-learn

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

2017-01-20 Thread Dukc via Digitalmars-d-learn

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

2017-01-20 Thread Dukc via Digitalmars-d-learn

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.