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,...)
工作.只是需要些好的辅助函数
.