d别名参数的约束
原文
别名参数
的约束检查
是否编译时,它实例化函数字面
模板.这会触发用户函数字面
中的在IFTI
实例化它之前无法检测
到的潜在错误
.
这些错误随后会导致约束
失败,因为不能编译字面
.约束
随后会从要用的候选列表
中删除匹配
模板.
void f(alias a)() if (is(typeof(a()))) {}
void main()
{
f!(x => blarg);
}
__traits(compiles, a());
应移进static if
测试,并带有用
错误消息.而std.algorithm.all
更改为使用静断
:
问题,拉取
但这仍丢弃
了实际
的编译错误
,只是说可调用对象
不工作,而没有真正
说明原因(如果它接受range.front
作为参数,为什么不是一元判词
?).或,应删除约束
,会在可调用对象
主体中,得到说明
确切原因的内部错误
.但这对重载
没用.
是否有新特征
来解决
它呢?
假定,
__traits(callable, expr, args);
(如果expr
是函数模板),它只执行IFTI
,并检查expr
的参数列表
是否接受args
.它不检查expr(args)
是否实际编译
,它忽略expr
正文中的错误.
它不检查
返回类型,因为函数块
不编译且需要推导返回类型
时,一般不可能.但是,与重载可调用对象
参数相比,对重载可调用对象的返回类型
似乎并不那么重要.
新特征
可用作约束
或静如
条件.作为约束,可帮助确定匹配
哪些重载.两个重载:
void f(alias a)()
if (__traits(callable, a, int()))
//主体将调用(int)
// 主体将调用(int,int)
void f(alias a)()
if (__traits(callable, a, int(), int()))
该特征允许
即使a
的主体
包含错误,根据a
有的参数数量
选择其中一个重载
.然后实例化f
的一个重载
,并触发内部模板
错误,指出a
有个内部错误.它比Phobos
的现状要好得多
,因为有精确
的错误消息
.
在模板
中,我更喜欢使用静如(static if)
来避免类似情况.否则,很难
找到错误原因.
失败时,最好让__traits(compiles)
返回错误消息
,而不仅是布尔值false
.然后可编写如下代码:
enum compResult = __traits(compiles, expr);
static if (compResult) // 隐式转换为极
{
doStuffWith(expr);
}
else
{
// 打印错误消息
static assert(0, compResult.message);
}
要让约束
理解它,需要更改
编译器,但这应该不难.可能也应让没有显式
消息参数的
static assert(__traits(compiles, expr));
打印返回
消息.
参考
问题是,你的约束变成:
foo(alias bar) if (__traits(compiles, exprUsingBar).hasOnlyImplementationIssues)
OnlyImplementationIssues
会很乱,很难实现,且基本上重做
编译器.且,如果只是串
,则可能随编译器
版本而更改.更改
错误消息是重大更改
.
好吧,如果特别想要__traits(callable)
的语义,它必须变成
这样.如果只想
更好显示错误消息
,这是本帖子所关注
的,这是不必要
的.
需要改进__traits(compiles)
,因为(1)
在现有代码中广泛使用它,(2)
有时__traits(compiles)
有用.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现