2016-08-23 11 views
2

Dテンプレートを呼び出して、渡された引数に.sizeofを呼び出そうとしています。理想的には型名(または型式)か、変数名または式(もちろんタイプもあります)。式または型名(DLang)で呼び出されたDテンプレート

私は現在、私は物事を正しく行うにはどうすればよいので

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

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

のように、テンプレートを複製しなければなりませんでしたか?

答えて

4

あなたが持っているものから、最初のテンプレートは、の2番目を必要とせずに動作します。例えば、このコード

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などの組み込みタイプはシンボルではなくキーワードであるということです。ウォルターブライトは、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

再びあなたの助けに感謝 - あなたは正確なものすべてがほぐれてきたユースケースを見つけました。これらのkludgesが必要でないようにこれが固定されることを望みましょう。 –

関連する問題