2
我試圖調用D模板並在傳入的參數上調用.sizeof
,理論上可以是類型名稱(或類型表達式)或變量名稱或表達式(當然也有一個類型)。使用表達式或類型名稱調用的D模板(DLang)
我目前有複製的模板,像這樣
template mytem(alias T) { xxx T.sizeof xxx }
template mytem(T) { xxx T.sizeof xxx }
我該怎麼做正確的事情?
我試圖調用D模板並在傳入的參數上調用.sizeof
,理論上可以是類型名稱(或類型表達式)或變量名稱或表達式(當然也有一個類型)。使用表達式或類型名稱調用的D模板(DLang)
我目前有複製的模板,像這樣
template mytem(alias T) { xxx T.sizeof xxx }
template mytem(T) { xxx T.sizeof xxx }
我該怎麼做正確的事情?
那麼,從你在那裏,第一個模板幾乎工作,而不需要第二個。例如,該代碼
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
許多再次感謝您的幫助 - 你正是看準這裏的東西都挺解開的用例。讓我們希望這個問題得到解決,因此這些問題將不再需要。 –