使用ParameterTypeTuple测试函数签名

时间:2010-08-01 17:04:28

标签: unit-testing templates metaprogramming d

我正在编写一个带有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.traitsrealMain的有效性确定为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巫师?

1 个答案:

答案 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