原文
static struct S(E, T)
{
private T flags;
private enum mask(string name) = 1 << __traits(getMember, E, name);
pure nothrow @nogc @safe final {
bool opDispatch(string name)(bool v)
{
v ? (flags |= mask!name) : (flags &= ~mask!name);
return v;
}
bool opDispatch(string name)() const scope
{
return !!(flags & mask!name);
}
}
}
enum F {square,circle,triangle }
S!(F, ubyte) s;
assert(s.square);
assert(!s.circle);
assert(s.triangle);
dmd中,生成的取置器是extern(C++)的,所以LDC/GDC可从C++中访问他们,而opDispatch则不行.
改进版,最小化了串插件,且无opDispatch:
static struct S(E, T)
{
private T flags;
private template Impl(T mask)
{
pure nothrow @nogc @safe final
{
bool Impl(bool v)
{
v ? (flags |= mask) : (flags &= ~mask);
return v;
}
bool Impl() const scope
{
return !!(flags & mask);
}
}
}
static foreach (mem; __traits(allMembers, E))
mixin("alias "~mem~" = Impl!(1 << E."~mem~");");
}
enum F { square,circle=5,triangle=7 }
S!(F, ubyte) s;
assert(s.square);
assert(!s.circle);
assert(s.triangle);










