2016-08-23 9 views
2

전달 된 인수에 D 템플릿을 호출하고 .sizeof을 호출하려고합니다. 이상적으로는 typename (또는 유형 표현식)이거나 변수 이름 또는 표현식 (물론 유형도 있습니다).표현식 또는 typename (DLang)과 함께 호출되는 D 템플릿

나는 현재 내가 일을 제대로 할 어떻게 그렇게

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

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

같은 템플릿을 복제 했어?

답변

4

글쎄, 첫 번째 템플릿 거의은 두 번째 템플릿이 필요없이 작동합니다.

4LU 
4LU 
4LU 

그러나 예,이 코드

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))); 
} 

인쇄의 경우, 작동하지 않습니다 내장 타입 - 예를 들어, size!int은 컴파일되지 않습니다. 문제는 alias 매개 변수가 기호를 허용한다고 가정하는 반면, int과 같은 기본 제공 유형은 기호가 아닌 키워드입니다. 어떤 논의가 있은 후 월터 브라이트는 alias 매개 변수가 alias 문과 비슷한 방식으로 작동하도록 변경해야하며 내재 된 유형을 허용하지만 변경이 아직 이루어지지 않았다는 것을 알고 있습니다. 해결 방법은 variadic 템플릿을 사용하지만 길이를 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가 필요하지 않을 것이기 때문에 이것이 고정되기를 바랍니다. –