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