原文
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);