2013-03-18 58 views
2

如果您定義接受委託的函數,那麼當您調用該函數時,D可以鍵入推斷委託參數。所以,如果我寫的帶有簽名的函數:使用未知數量的已知類型參數輸入推斷委託參數

void foo(void delegate(int,string) dlg) 

我可以用叫它:

foo((a,b){}); 

和d將推斷出aintbstring

但是如果我事先不知道委託人會有多少個論據呢?如果我寫

void foo(T...)(void delegate(T) dlg) 

我可以打電話:

foo((int a,string b,char c,boolean d){}); 

但我必須爲每一個參數指定的類型。

現在,我想foo接受任何參數的代表 - 所有相同的類型。所以,我可以打電話:

foo((a,b,c,d,e,f,g){}); 

和d將推斷出ag都是string秒。

請注意,我需要的是而不是 varidaic函數。 dlg本身不接受任何數量的參數,它是foo接受具有任意數量參數的委託。

在D中可以這樣做嗎?

編輯
事實上,它會更好,如果我可以定義默認參數,所以我可以寫

foo((a,b,int c,d){}); 

abd將字符串而cint

回答

3

這可能是一個增強請求。但現在你可以在編譯時通過它作爲別名:

import std.stdio; 

void foo(alias dlg)() 
{ 
    dlg(1, 2.0, [3], "a"); 
    dlg(1.0, 2, [[3]], "b"); 
} 

void main() 
{ 
    foo!((a, b, c, d) { writefln("%s %s %s %s", a, b, c, d); })(); 
} 
+0

在技術上,它不是一樣的,因爲在這種情況下沒有類型推斷髮生。別名委託成爲模板,並在通常的每次使用的基礎上實例化。據我所知,Idan詢問的內容稍有不同。 – 2013-03-20 09:15:51

+0

其實我可以使用這個,但由於某種原因,當我這樣做'isCallable!dlg'返回false,所以我不能使用'ParameterIdentifierTuple!dlg'和'ParameterTypeTuple!dlg'獲取委託的參數類型和名稱。有沒有辦法解決這個問題,還是我必須自己解析'dlg.stringof'來獲取這些信息? – 2013-03-22 01:24:45

+0

好的,問題是'dlg'是一個模板,而不是代表。如果我使用'dlg(字符串,字符串,字符串,字符串)'我可以得到它的參數特徵數據。我怎樣才能知道一個模板有多少個模板參數? – 2013-03-22 02:24:50