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 @ 2022-04-09 10:43  zjh6  阅读(17)  评论(0)    收藏  举报  来源