d约束可帮助错误消息

原文

template isFilter(alias filter, bool asserts = false)
{
    enum isFilter=
    {
        import std.traits : ReturnType, Parameters, isMutable, isScalarType;
        alias RT = ReturnType!(typeof(filter));
        static if(!is(RT == bool))
        {
            static assert(!asserts,expect!(RT, bool, "Return"));
            return false;
        }

        alias params = Parameters!filter;
        static if(params.length != 1)
        {
            static assert(!asserts, expect!(cast(int) params.length, 1,"参数数"));
            return false;
        }

        alias param = params[0];
        static if(isMutable!param && !isScalarType!param)
        {
            static assert!(!asserts, "参数必须是常量或标量");
            return false;
        }

        return true;
    }();
}
template expect(alias actual, alias expected,string descr)
{
    enum expect=
    descr~": 得到'"~actual.stringof~"',但期望'"~expected.stringof~"'";
}

template expect(Actual, Expected, string descr, bool convertable = false)
{
    enum expect =
    {
        static if(convertable)
        {
            enum equalType = is(Actual : Expected);
        }
        else
        {
            enum equalType = is(Actual == Expected);
        }

        return !equalType ?
        descr~": 得到 '"~Actual.stringof~"', 但期望'"~Expected.stringof~"'" : "";
    }();
}

只是简单的模板开关,用于控制编译时是否抛出AssertionError.
isFilter可用作if()语句中的普通约束,也可用作提供有用错误消息编译时接口(这时很可能在函数体内).该方法相当方便,可通过更多的辅助函数和/或mixin更方便.
最重要:(如果asserts默认为false),它完全后向兼容!
为什么不这样做呢?仅因为__traits(compiles,...)吗?也可同__traits(compiles,...)工作.只是需要些好的辅助函数.

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