d的模板别名问题
创始人
2025-06-01 18:10:16

原文

struct Matrix(S, size_t M, size_t N)
{
}alias Vec3(S) = Matrix!(S, 3, 1);
void foo(U)(U v) if (is(U == Vec3!S, S))
{
}void bar(U)(Vec3!U v) {}
void main()
{import std.stdio;Vec3!float v;writeln(is(typeof(v) == Vec3!S, S)); // 假// bar(v); // 错误,不能用Matrix!(float, 3, 1). huh!调用bar// foo(v); // 错误,不满足约束
}

这与DIP1023有关.
因为目前不能用模板别名参数,那么如何更直接编写约束?
这像是有缺陷的设计:

writeln(is(Vec3!float == Vec3!S, S)); // 假

我可忍受比这更多的宏.
我也不喜欢再次编写矩阵!(S,3,1).

我最近遇见了类似的问题.

import std;
static assert(isInstanceOf!(Array, Array!char)); // 真
static assert(isInstanceOf!(Regex, Regex!char)); // 假

问题是编译器非常快速地用Matrix!(float,3,1)重写typeof(v),但编译器无法分辨出

Matrix!(float, 3, 1)

就是Vec3!S,对某些通用S(它无法弄清楚S应该是什么).
对特定的S,可以.如writeln(is(typeof(v)==Vec3!float));打印.所以像

void foo(U)(U v) if (is(U == Vec3!float) || is(U == Vec3!double)) {}

即使它更尴尬,但有效.
需要某种反向通知编译器即矩阵!(float,3,1)也是Vec3!float的方法.
根本问题是,需要某种方法来告诉编译器,从某个具体类型到模板别名的映射.
在此讨论

编译器不能重写或扩展Vec3!S矩阵!(S,3,1)然后轻松求值:

is(Matrix!(float, 3, 1) == Matrix!(S, 3, 1), S) // 真

DIP1023是关于解析模板别名的.编译器当前为了调用函数按不同事物,处理Vec3!S矩阵!(S,3,1).DIP1023试重写Vec!S矩阵!(S,3,1).

问题是:

alias Vec3(S) = Matrix!(S, 3, 1);
//实际是
template Vec3(S) {alias Vec3 = Matrix!(S, 3, 1);
}

缩写,表明,这是非常强大的,但可能不是你想要的,但可很容易地写:

template Vec3_alt(S) {static if (!is(S == int))alias Vec3_alt = Matrix!(S, 3, 1);elsealias Vec3_alt = real;
}

此时,你如何解析Vec3!S,这并不像仅按矩阵!(S,3,1)重写那么简单.

DIP1023中的方法仅适合D支持的模板别名功能的有限(尽管很常见)子集,因此它是模板别名推导的特殊大小写.这一点,再加上"为什么不只使用模板约束"问题,就很难获得支持.

它看不到这一点.

问题是,你正在通过单向窗口查看.一般,编译器无法解决它,因为它不知道模板得到的东西之间的关系:

alias Foo(T) = int;
//以下对编译器等价
is(Foo!float == Foo!T, T);
is(int == Foo!T, T);

编译器应如何假定T?当它看到类型时,它以int出现,别名模板自身已完全消失了.
现在,我相信编译器可为简单别名做个特例,但必须定义规则,且语言设计者要同意添加它.

这是个令人沮丧的限制.大约16年前我提出了一个,这里.

它看起来很容易解决,但实际很难.
与用重写代码后,试向后使用C预处理器宏一样.
但总会有编译器无法弄清楚的情况,因此会有些混乱.
实例化模板前,编译器不知道模板别名.阅读代码很明显.但内部,不会存储它.
SHOO的例子更是无法解决.isInstanceOf自身就是个模板,因此是缓存的.根据D语言规则,别名不能导致不同实例化.

alias Foo(T) = T;
alias Bar(T) = T;pragma(msg, isInstanceOf!(int, Foo)); // 应为真
//如果这是真,现在缓存`它们`,因为它们与第一个等价
pragma(msg, isInstanceOf!(Bar!T, Foo));
pragma(msg, isInstanceOf!(Foo!T, Foo));
//不应根据调用顺序决定求值

-史蒂夫

要解释机制:
编译器知道用来实例化的,在模板内保存的结构模板参数是什么,因为此信息与结构一起存储.可完成,因为,且仅因为:在实例化模板中只有1个结构.也即,可精确地从结构和类,恢复两个模板参数:

template Foo(T) {struct Foo { }
}

可这样,因为且仅因为,Foo结构的词法父级是带TFoo模板.对有唯一存储词法父级属性的类型,可恢复模板参数;否则,不行.

如下不行:

template identity(int i) { enum identity = i; }void foo() {enum five = identity!5;static assert(is(five == identity!y, int y) && y == 5);
}

它不管用,因为five不会按父项词法上引用同一,因为fiveint,而int不是与同一模板唯一关联的类型.

你需要的是全新的类似类型类语言功能.现在有添加类型类到语言中的讨论,如,它们会使区间更加时髦,但这不能使模板推导稍微更强大.

但是如果使它适合结构,(带些额外的样板)它会适合每种类型:

template identity(int i) {struct wrapper { int w = i; }enum identity = w;
}void foo() {enum five = identity!5;static assert(is(five == identity!y, int y) && y == 5);
}

通过一些新的降级,甚至可摆脱该样板.

如,如果检测这样使用它,只需自动添加"父"属性到模板参数中,(但需要一些编译时间).

"某处"定义,因为可用foo的不同编译器调用中编译同一.不能给int添加父属性,因为那将是不同类型.可在结构中包装int,可在结构中包装所有内容,然后is今天就可工作了.但这很麻烦.

为什么不直接从Rust中窃取特征,那么Matrix可仅当N=1且函数只可接受Vector参数,才能实现向量.

注意,即使is(five)错误的,因为不是类型.
因此,即使模式匹配成功,上面的静断也是假的.(我看到另一个D用户说,他认为is可测试类型实例,它不能).为了匹配值模式,需要另一个构造,也许是匹配式.

好的

alias five = identity!5;

也不行.(如果不是同名模板,推导式可工作).

我想如果举一个可能有效的示例,为什么它不行,就更加明显了:

alias identity(int i) = int;void main() {alias five = identity!5;static assert(is(five == identity!y, int y) && y == 5);
}

因为five是个类型,而不是一个,且它是一个没有父级词法(int)类型.

好吧,别名原符号工作方式相同,这就是问题所在.你无法推导生成别名的模板实例化,因为"别名成员""模板结构",不是相同词法成员,编译器看不到别名.

类型特征类型类等会更简洁的满足这一需求,并使许多区间代码更好.

相关内容

热门资讯

6.3股市早8点丨三天假发生了... 三天假发生了啥事?股市早8点 老沙自媒体2025年6月3日(周二)每日大道正道消息▊美股小涨北京时间...
绿通科技:拟现金收购大摩半导体... 【绿通科技筹划收购大摩半导体不低于51%股权】6月2日晚间,绿通科技公告,筹划现金收购江苏大摩半导体...
股市必读:爱博医疗(68805... 截至2025年5月30日收盘,爱博医疗(688050)报收于71.41元,下跌1.76%,换手率1....
销售会“提问”,再冷淡的客户,... 回复“9”限时领《9套销售话术资料包》 作者:Dora 在销售咨询过程中,“高效提问”不仅是获取客户...
原创 德... 2025年2月24日,恰逢俄乌冲突爆发三周年,德国也于前一天举行了新一轮的议会选举。在过去的三年中,...
明天沪主板新股海阳科技申购!聚... 明天,沪主板将迎来一家新股申购! 格隆汇获悉,海阳科技(603382)于6月3日申购,发行价格为11...
三一重工、山推股份谋求赴港上市... 本报(chinatimes.net.cn)记者李贝贝 上海报道工程机械龙头企业纷纷瞄准港股市场:5月...
2024跨境电商平台出海目的地... 今天分享的是:2024跨境电商平台出海目的地中东市场:行业呈现三足鼎立态势,物流和支付是竞争关键 报...
虎嗅【作·嗅之星】周榜第264... 作·嗅之星榜单,以周榜的形式,呈现每周新鲜出炉的优秀作品。2025年5月23日~2025年5月29日...
原创 美... 尊敬的审阅人员和品鉴读者:本文是经过严格查阅相关权威文献和资料。 全文数据有据可依,可供查证。 美...
原创 美... 前言 中国商务部那间熟悉的发布厅里,发言人拿出一摞资料,语气格外严肃。 说好了一起守规矩,结果呢?...
原创 节... 不出意外,大家的仓位越来越轻了。 如果目前的位置是今年的顶部,为什么要想方设法驱赶散户离场呢?大家都...
美股下跌,钢铁股大涨!金价重回... 6月2日,美国三大股指开盘走低,截至22:40发稿,道指跌0.5%,标普500指数跌0.25%,纳斯...
深康佳A:拟择机出售武汉天源不... 新京报贝壳财经讯 深康佳A6月2日晚间公告,目前公司持有武汉天源(301127)股份合计8618.4...
深夜,利空!直线跳水! 深夜利... 美国经济传来利空信号。今晚,美股三大指数盘初集体跳水,道指一度跌超1%。消息面上,ISM公布的数据显...
这个账单,决定后半辈子幸福… ... 图:Hiroki Kawanabe 第一波延迟退休的人出来了。 挺多人晒出来的退休年龄数字,已经有零...
国际金价年内上涨超25%5月纳... 【#国际金价年内上涨超25%##5月纳指涨幅接近10%#】首先来看美股上周交易的情况。受美欧贸易谈判...
深夜!美股下跌,黄金白银原油飙... 北京时间6月2日晚间,美股低开低走。截至22:02,道琼斯跌0.89%,纳斯达克跌0.51%,标普5...
德国银行高管:美政府政策频繁变... 根据德国《商报》6月2日刊发的专访文章,德国国家开发银行复兴信贷银行董事会主席斯特凡·温特尔斯指出,...
理想一季度销量、营收同比有所增... 理想汽车公布2025年第一季度财报。财报显示,第一季度,公司实现营收259亿元,同比增长1.1%;净...
科技破局、全链升级:澳优四大羊... 人们所熟悉的羊奶资源,除了应用在配方奶以外,还有哪些新应用?羊奶的产业化,有哪些技术瓶颈有待突破? ...
靠卖丸子年入百亿,拿下10万家... 订阅 快刀财经 ▲ 做您的私人商学院一粒鱼丸的逆袭史。作者:朱末来源:快刀财经(ID:kuaidao...
每30秒卖一辆,老牌车企在海外... 你还记得“奇瑞QQ”吗?今年又又又打算上市那个。这张国产汽车销量逆袭并称霸海外的成绩单上,奇瑞是MV...
“近视神药”跌下神坛,“眼药大... “近视神药”能成为百亿大药吗??作者 | 赵普编辑丨高岩来源 | 野马财经在眼药领域,尤其是备受瞩目...
棕榈油、豆油、菜油:供给预期双... 【油脂市场供需及价差情况分析】棕榈油方面,产地预估产量环比走高,季节性增产临近,供给预期增加。国内港...
这届高考,仍是史上最难 史上最... 作者 |暴雨再过几天,我们会迎来历史上最难的一届高考。你可能会反驳,1335万名考生,比去年少了7万...
关键时刻,日美关系出现重大转折... 作者 | 无疆编辑 | 剑书日 美关系出现一个重大转折,影响可能不亚于贸易协议。就在最近,曾被拜登坚...
深圳半山巨宅底价成交,3749... “老李,听说了吗?大鹏那栋别墅被人底价捡走了!” “真的假的?那个叶老板花大钱建的城堡,现在才卖三千...
郑商所就丙烯期货和期权合约及期... 5月30日,郑州商品交易所就丙烯期货和期权合约及期货业务细则公开征求意见。这意味着我国产量最大的烯烃...
上涨!金饰价格重回1000元大... 随着国际黄金价格上涨,国内金饰价格重新升至每克千元以上。 6月2日,老凤祥金饰品为1000元/克,这...