2016-08-23 51 views
2

我試圖調用D模板並在傳入的參數上調用.sizeof,理論上可以是類型名稱(或類型表達式)或變量名稱或表達式(當然也有一個類型)。使用表達式或類型名稱調用的D模板(DLang)

我目前有複製的模板,像這樣

template mytem(alias T) { xxx T.sizeof xxx } 

template mytem(T) { xxx T.sizeof xxx } 

我該怎麼做正確的事情?

回答

4

那麼,從你在那裏,第一個模板幾乎工作,而不需要第二個。例如,該代碼

struct S 
{ 
    int i; 
} 

template size(alias T) 
{ 
    enum size = T.sizeof; 
} 

void main() 
{ 
    pragma(msg, size!10); 
    pragma(msg, size!S); 
    pragma(msg, size!(S(10))); 
} 

打印

4LU 
4LU 
4LU 

但是,它不會與工作內建類型 - 例如size!int不會編譯。問題是alias參數應該接受符號,而內置類型如int是關鍵字而不是符號。我的理解是,在經過一番討論之後,Walter Bright確信應該改變它,以使alias參數更像alias語句,並且它們會接受內置類型,但尚未做出這種更改。同時,解決方法是使用可變模板,但將其限制爲1。

struct S 
{ 
    int i; 
} 

template size(T...) 
    if(T.length == 1) 
{ 
    enum size = T[0].sizeof; 
} 

void main() 
{ 
    pragma(msg, size!10); 
    pragma(msg, size!S); 
    pragma(msg, size!(S(10))); 
    pragma(msg, size!int); 
} 

打印

4LU 
4LU 
4LU 
4LU 
+0

許多再次感謝您的幫助 - 你正是看準這裏的東西都挺解開的用例。讓我們希望這個問題得到解決,因此這些問題將不再需要。 –