D语言中函数前的"!"作用是什么?项目学习中的技术问询
D语言中函数调用前
!符号的作用 刚接触D语言的时候,我也对着函数名前的这个!符号纳闷了好一阵,太懂这种摸不着头脑的感觉了😉。其实这个!是D里模板实例化的核心标记,专门用来处理模板函数(或模板类/结构体的成员函数)的参数指定。
下面用几个常见场景帮你理清:
- 显式指定模板参数:比如标准库
std.conv里的to模板函数,用来做类型转换。如果要把字符串转成整数,你会写to!int("123")——这里的!int就是明确告诉编译器,这个to模板要实例化为处理int类型的版本,括号里的"123"才是函数的普通参数。 - 处理推导歧义或自定义行为:再看
std.algorithm的sort模板,默认排序是升序,但如果你要降序,就得显式传入比较器模板参数:sort!((a,b) => a > b)(arr)。这里!后面的lambda表达式就是自定义的排序规则,用来实例化符合需求的sort版本。 - 模板类/结构体实例化:除了函数,
!也用来实例化模板类,比如Array!int myArray;,意思是创建一个存储int类型的Array模板实例,和函数场景的逻辑完全一致。
要注意和逻辑非运算符区分开:逻辑非的!是用在布尔表达式前(比如!isValid),而模板实例化的!后面必然跟着模板参数(类型、值、lambda等),之后才会出现函数调用的括号(或者类的实例化语句)。
简单总结:
- 函数名后紧跟
!,代表你要实例化一个模板函数,!后面的内容是模板参数; - 编译器大多时候能自动推导模板参数,但遇到需要自定义行为、推导有歧义的情况,就得手动用
!来明确指定参数。
内容的提问来源于stack exchange,提问作者Kurt Wimer
相关产品推荐
相关产品推荐

