0
点赞
收藏
分享

微信扫一扫

d枚举生成位

独兜曲 2022-08-07 阅读 43


​​原文​​

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


举报

相关推荐

0 条评论