0
点赞
收藏
分享

微信扫一扫

d具体化函数参数

​​原文​​​ 今天,我有一堆带有​​执行某些操作​​的参数的函数,我想通过​​程序​​的​​命令行​​向用户​​公开​​他们.此外,为了尽量方便用户,程序​​帮助文本​​应准确地描述​​每个函数​​(在​​命令行​​上被视为​​子命令​​)及​​每个函数​​带的​​参数​​.
当然,传统方法很简单:编写打印描述​​函数及其参数​​文本的​​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​​​到实际​​按名迭代​​​的​​目标​​函数.)


举报

相关推荐

0 条评论