d枚举生成位
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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现