2014-10-17 10 views
1

입력 및 대상으로 정확하게 짝을 지어야하는 데이터 요소를 보유하고있는 사용자 지정 컨테이너에서 반복 할 입력 범위를 만들고 있습니다. 훈련 데이터 (double [] []), 입력 (double []) 및 대상 (double [])을 반환하기 위해 다른 범위가 필요합니다. 나는 다음 코드를 컴파일하고 완벽하게 처리 할 수 ​​있었지만 그 이유는 모른다.구조 표현식 매개 변수 대 형식 매개 변수

public struct DataRange(string type) 
if(type == "TrainingData" || 
type == "InputData" || 
type == "TargetData") 
{ 

    private immutable(int) length; 
    private uint next; 
    private Data data; 

    this(Data d){ 
    this.length = d.numPoints; 
    this.next = 0; 
    this.data = d; 
    } 

    @property bool empty(){return next == length;} 

    @property auto front(){ 
    static if(type == "TrainingData") 
     return this.data.getTrainingData(next); 
    else static if(type == "InputData") 
     return this.data.getInputData(next); 
    else return this.data.getTargetData(next); 
    } 

    void popFront(){++next;} 
} 
static assert(isInputRange!(DataRange!"TrainingData")); 
static assert(isInputRange!(DataRange!"InputData")); 
static assert(isInputRange!(DataRange!"TargetData")); 
내가 Alexandrescu에 의해는 "D 프로그래밍 언어"를 읽어 봤는데

, 나는 형태

struct S(T){...} // or 
struct S(T[]){...} 

하지만, 이러한 유형의 매개 변수가 아닌 표현 나는 것 같은을의 매개 변수 구조체를 발견했다 끝난. 매개 변수가있는 유형이있는 dlang.org에서 유사한 예제를 찾을 수 없었습니다.

이 내용은 DMD 2.066 및 GDC 4.9.0에서 컴파일되고 작동합니다.

나는 왜 이것을 시도했는지, 그리고 그것을 뒤돌아 보면 나는 그것이 왜 작동 하는지를 모른다. 아무도 내가 누락 된 걸 압니까? 이 문서는 어디에 문서화되어 있습니까?

+1

온라인에서 사용할 수있는 D의 템플릿에 대한 유용한 책/가이드가 있습니다. https://github.com/PhilippeSigaud/D-templates-tutorial. 때로 언어 문서보다 더 잘 설명 할 수 있습니다. – yaz

답변

1

또는 열거 형을 사용하여 잘못된 템플릿 인스턴스화가 불가능한 제약 조건을 단순화 할 수 있습니다 (코드에서 템플릿 제약이 완벽하게 수행하더라도). 예 :

+0

그게 너무 좋습니다, 나는 그게 사실 더 마음에 듭니다. 훨씬 더 간결하고 재사용이 가능합니다. 끈은 조금 호각스러운 것 같았다. 하지만 다시 사용할 수 있습니다. 예를 들어, 재사용 가능한 많은 코드를 사용하여 데이터의 어느 부분을 처리 할 것인지를 구분할 다른 영역이 있습니다. 문자열을 다시 만들고 똑같은 템플릿 제약 조건을 다시 작성하는 대신이 열거 형을 다시 사용할 수 있습니다. – Ryan

2

좋아, 대답을 찾았습니다. 이 내용은 자습서 나 책의 어느 곳에서나 언급되거나 설명되지 않았지만 결국 http://dlang.org.template.html에서 찾을 수있었습니다. 기본적으로 여기에는 두 가지 일이 있습니다.

1) 1. 내 코드가 구조체라고해도 구조체는 실제로 템플릿입니다. 이 템플릿은 템플릿으로 설명되지 않았지만이 온라인 및 책의 예를 보았습니다. 제가 템플릿 키워드를 사용하지 않았기 때문에 다소 혼란 스러웠습니다. 그리고 책에서 그들은 "매개 변수화 된"것으로 설명됩니다. 템플릿 매개 변수 유형, 값, 기호 또는 튜플

수 있습니다

위의 링크 된 웹 사이트에서

2.) ... 그래서 내 경우에는 내 템플릿 매개 변수는 상징이었다. 이 책의 예제는 유형을 사용했습니다.

웹 사이트의 언어 사양을 파헤 치면 책에서 다루는 것보다 더 많은 일이 있음을 알 수 있습니다.