d前向引用问题

原文

alias aliases(a...) = a;

template sort(alias f, a...) {
static if (a.length > 0) {
    alias x = f!(a[0]);
    alias sort = a;
}
else
    alias sort = a;
}

alias SortedItems = sort!(isDependencyOf, String);

enum isDependencyOf(Item) = Item.DirectDependencies.length == 0;

struct String {
    alias DirectDependencies = aliases!();
    enum l = SortedItems.length; // 无`length`属性
}

怀疑实例化排序模板时,它太急于计算它的参数,它应该只看到String是个结构,而未语义化它的内容.
修复

似乎,第一次"模板排序"时,它不能设置"alias decl",因为这两个"别名排序"赋值在条件编译之后隐藏.
因此'alias decl'null.
因此,在'struct String'的语义中,它遇见了'SortedItems.length'.'alias decl'null,所以'SortedItems'变为'sort!(...)',而'sort!(...)'变为'void',而'void'没有'length'.
或许可通过注意'static if'成员是否是模板中唯一成员这个事实,这样它就可急切求值了?

查看扩展成员,也许可分两趟完成,一次是顶级条件编译,然后检查单个成员,然后再检查其余.

posted @   zjh6  阅读(18)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示