d努力打败点点点2
接着比:
int double_int(int val) { return 2 * val; }
T double_int(T val) { return val; }
void double_ints(alias pred, T... args) {
pred(double_int(args)...);
}
可通过用UFCS
的数组语法
建议来完成:
void double_ints(alias pred, T... args) {
args.pred();
}
:后续操作,可使:
Tup + ... -> Tup[0] + Tup[1] + ... + Tup[$-1]
我期望static foreach
可搞定它.但我们可再深入一点.D
没有特殊语法来求和
数组元素,但可用
库函数来完成.下个观察是,求和
元组元素,可隐式转换所有元组成员
为单个算术类型
.有种方法可完成:
[ Tup ]
现在可转换元组
为数组字面
,可按当前求和
数组字面一样求和.不需要额外语法.
is(MyType in Types)
同样也工作,不必.受控扩展:
alias Tup = AliasSeq!(0, 1, 2);
alias Tup2 = AliasSeq!(3, 4, 5);
[ Tup, Tup2... ]... -> [ 0, 3, 4, 5 ], [ 1, 3, 4, 5 ], [ 2, 3, 4, 5 ]
不怕,[ Tup ~ [Tup2] ]
就行了.同样,先用数组,而不是元组
.
//模板初化化
alias TTup = AliasSeq!(int, float, char);
MyTemplate!(Tup, TTup.sizeof...)... -> MyTemplate!(0, 4, 4, 1), MyTemplate!(1, 4, 4, 1), MyTemplate!(2, 4, 4, 1)
虽然,对模板没有UFCS
,但将是要点:
Tup.MyTemplate!(TTup.sizeof)
否则将遭受我上面提到的自下而上
的分析语义问题.
//替换`静映射`
alias staticMap(alias F, T...) = F!T...;
用这个:
alias staticMap(alias F, T...) = F!T;
更多
//受控扩展,带模板参数列表.
AliasSeq!(10, Tup, 20)... -> ( 10, 0, 20, 10, 1, 20, 10, 2, 20 )
我不喜欢该例,因为它不能用d一般
的自下而上
语义来完成,它依赖于一些自上而下
的修改,可能会导致各种意想不到
的困难.见上面把Tup
移出参数列表的UFCS
示例.
AliasSeq!(10, Tup..., 20) -> ( 10, 0, 1, 2, 20 )
//对比
AliasSeq!(10, Tup, 20) -> ( 10, 0, 1, 2, 20 )
:对这些折叠表达式
,如果像我建议元组
一样应用于数组
,那将是理想的
使用通用语法
的数组和元组
的想法有很多优点,这就是我所提议的
但是,[ Tup ]
不一定是相同类型,
只有当,1 + 'a' + 1.0 + 1L + 2.0L
有个公共算术
类型时才可计算.
考虑:
alias Tup = AliasSeq!(0, 2, 3);
void fun(int);
fun(Tup);//扩展为`fun(0),fun(1),fun(2)`
重写为:
Tup.fun();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现