2014-10-17 70 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)从上面链接的网站...

模板参数可以是类型,值,符号或元组

所以在我的情况,我的模板参数是一个符号。书中的例子使用了类型。

挖掘网站上的语言规范显示,这本书还有很多内容!