2014-10-17 53 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")); 

我一直在讀了「d編程語言」,由Alexandrescu的,我已經找到了形式

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 2014-10-17 08:34:47

回答

1

或者,您可以使用枚舉來簡化約束,使得不可能發生錯誤的模板實例化(即使在您的代碼中模板約束完美無缺)。例如:

enum rangeKind{training, input, target}; 
public struct DataRange(rangeKind Kind) 
{ 
} 

void main(string args[]) 
{ 
    DataRange!(rangeKind.training) dr; 
} 
+0

太棒了,我實際上更喜歡那個。它更簡潔,可重複使用。琴絃顯得有點h。。但是這可以被重新使用,例如還有其他方面我想要區分哪些部分我想要處理的數據,同樣也有很多可重用的代碼。我可以再次使用這個枚舉,而不是重新創建字符串和完全相同的模板約束。 – Ryan 2014-10-17 21:43:30

2

好的,我找到了答案。儘管在教程的任何部分或書中沒有具體提及或描述,但我終於能夠在http://dlang.org.template.html找到它。基本上這裏有兩件事情。

1.)雖然我的代碼說結構,這是一個真正的模板(結果在一個結構)。我已經在網上和書中看到了這個例子,儘管它沒有被描述爲模板。這有點令人困惑,因爲我沒有使用template關鍵字,而在書中它們被描述爲「參數化」。

2)從上面鏈接的網站...

模板參數可以是類型,值,符號或元組

所以在我的情況,我的模板參數是一個符號。書中的例子使用了類型。

挖掘網站上的語言規範顯示,這本書還有很多內容!