代码之家  ›  专栏  ›  技术社区  ›  anton.burger

用ParameterTypeTuple测试函数签名

  •  2
  • anton.burger  · 技术社区  · 14 年前

    我正在编写一个带有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 传递给 rdmd ,因为
    • 似乎没有好的方法来决定 通过 --主要 对于定义自己的模块,当为目录层次结构中的每个文件自动运行单元测试时--退出代码来自 RDMD 与失败的编译相同。

    我在用 std.traits 确定 realMain 的有效性 主要的 函数,并确保生成 主要的 有相同的签名。一切似乎都在工作,但我认为它可能更干净。当前,用于检查的模板有效 主要的 参数如下:

    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 表达式,在没有显式测试元组长度和单独检查字符串类型的情况下,但到目前为止,我刚起步的元编程fu已经很短了。

    有什么主意吗,巫师?

    1 回复  |  直到 14 年前
        1
  •  1
  •   BCS    14 年前

    您可以尝试将其与函数类型进行比较:

    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