2010-08-01 27 views
2

我正在使用mixin模板編寫模塊爲單元測試目的提供main函數。用法如下:使用ParameterTypeTuple測試函數簽名

/* 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爲自己定義的模塊,當自動運行單元測試的每個文件在di rectory層次結構 - 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表達,沒有明確地測試元組的長度,並分別檢查了字符串類型,但到目前爲止,我的新生元編程-fu已經不足。

任何想法,D巫師?

回答

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

+0

感謝您的回答看起來更乾淨。不專門測試函數的優點是可以使用其他類型的可調用值,但我同意,這是更清晰的。它似乎也是最接近我們現在的例子的慣用D來自Phobos源:) – shambulator 2010-08-25 16:33:30