原文 今天,我有一堆带有执行某些操作
的参数的函数,我想通过程序
的命令行
向用户公开
他们.此外,为了尽量方便用户,程序帮助文本
应准确地描述每个函数
(在命令行
上被视为子命令
)及每个函数
带的参数
.
当然,传统方法很简单:编写打印描述函数及其参数
文本的showHelp()
函数.然后在main()
中为函数名
编写大的switch
语句,每个case
块解析
程序参数,转换为合适形式
,并调用该显示
函数.
因此,我本着DRY
寻求了更好方法:把所述
函数放入包装
结构中,按静态标记它,添加由showHelp()
自省的串UDA
,来生成保证最新
的函数列表,并通过main()
生成必要的若块
.
帮助文本
很简单:只需检查包装器
结构,提取函数名
,描述串UDA
和参数名
列表,然后打印出来.
case
块有点棘手.如果每个函数
有相同参数集
,那就很简单了:只需在标准调用
中插件
函数名即可.但是,如果函数
有*不同*
参数呢?
然后灵感
来了:为什么要单独声明
这些变量呢?我不必.我可用is(typeof(func)Params:__parameters)
参数元组保存
参数,然后按该类型
用参数元组
声明复合变量
:
void main(string[] args) {
...
static if (is(typeof(myfunc) Params : __parameters)) {
Params funcArgs; //为所有函数参数使用一个名字
//现在`转换`命令行参数至正确类型来填充参数
foreach (i, T; Params) {
// std.conv.to是大炸弹
import std.conv : to;
funcArgs[i] = args[i+2].to!T;
}
//要调用函数,只需一次性传递整个聚集给它:
myfunc(funcArgs);
//感谢神奇元组类型,它会自动展开`funcArgs`元组为多个参数
}
}
复合变量'funcArgs'
具体化了目标
函数参数;允许解析命令行参数
循环中像伪数组
一样操作它.不必构建繁琐
参数列表的mixin!
(当然,实际代码,仍需要mixin
来绑定myfunc
到实际按名迭代
的目标
函数.)