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);
posted @   zjh6  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示