d区间原语错误消息
原文
我想出了个通用方法:
先写个验证器
方法:
bool testInputRange(T)() {
static assert(is(typeof(T.init.empty)));
static assert(is(typeof(T.init.front)));
static assert(is(typeof(T.init.popFront)));
return true;
}//返回值不必要,但不重要
我们就可这样:
void f(T)(T x) if (isInputRange!T) { ... }
enum isInputRange(T) = is(typeof(testInputRange!T));
//是输入区间
很普通,但现在,替换为:
enum isInputRange(T) = is(typeof(testInputRange!T)) || testInputRange!T && false;
明显,testInputRange!T && false
为假,而is(typeof(testInputRange!T)) || false
与is(typeof(testInputRange!T))
等价,虽然逻辑一样
,但有更好
的错误消息
.
struct S {}
f(S());
错误为:
range_check.d(12): Error: static assert: `is(typeof(S().empty))` is false
//告诉了我们,没有`empty`函数.
range_check.d(10): instantiated from here: `testInputRange!(S)`
range_check.d(4): instantiated from here: `isInputRange!(S)`
问题是,没有一次报告
所有问题.而front/popFront
也未报告,错误消息,只提示了empty
.
一种方法是:
void StaticAssert(alias x)() if (x) {}
bool testInputRange(T)() {
StaticAssert!(is(typeof(T.init.empty)));
StaticAssert!(is(typeof(T.init.front)));
StaticAssert!(is(typeof(T.init.popFront)));
return true;
}
现在错误消息中得到(12, 13, 14),
行号,
上面的isInputRange
不严格等价标准版
输入区间.因此如想支持多实例,必须同样要求分发
阶段.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现