我正在编写一个带有mixin模板的模块,以提供main
函数用于单元测试。用法如下:
/* For modules without their own main, e.g. libraries.
* main is conditionally supplied using version(unittest).
*/
mixin Main;
/* For executable modules defining function "realMain".
* Generated main has the same signature and return type
* as realMain, and transfers control to it. Additionally,
* main exits without calling realMain for version (unittest).
*/
mixin Main!realMain;
我的想法是我的每个模块都恰当地混合在main
中,以便:
--main
传递给rdmd
,因为--main
用于定义自己的模块的模块 - 退出代码来自rdmd
与编译失败相同。我正在使用std.traits
将realMain
的有效性确定为main
函数,并确保生成的main
具有相同的签名。一切似乎都在起作用,但我认为它可能更清洁。目前,我检查有效main
参数的模板如下所示:
template isMainArgTypes(alias main)
{
static if (is(ParameterTypeTuple!main == TypeTuple!()))
enum isMainArgTypes = true;
else static if (ParameterTypeTuple!main.length == 1
&& is(ParameterTypeTuple!main[0] T : const T[]))
{
enum isMainArgTypes = is(T : const char[]);
}
else
enum isMainArgTypes = false;
}
我确信必须有某种方法可以将中间条件压缩成单个is
表达式,而无需显式测试元组长度并单独检查字符串类型,但到目前为止,我的新生元编程功能已经下降短。
任何想法,D巫师?
答案 0 :(得分:1)
您可以尝试将其与功能类型进行比较:
enum isMainArgTypes = is(typeof(&main) == int function()) ||
is(typeof(&main) == void function()) ||
is(typeof(&main) == int function(string[])) ||
is(typeof(&main) == void function(string[]));
不短,但看起来更干净,因为它不需要static if