我在输入范围内迭代自定义容器,该容器包含需要保持与输入和目标精确配对的数据点。我需要不同的范围来返回训练数据(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。
我甚至不知道为什么我会这样做,回头看它我不知道为什么会这样。谁知道我错过了什么?这记录在哪里?
答案 0 :(得分:2)
好的,我找到了答案。虽然在本书的任何教程或书中的任何地方都没有特别提及或描述过,但我最终能够在http://dlang.org.template.html找到它。基本上这里有两件事。
1。)虽然我的代码说的是struct,但这实际上是一个模板(导致结构)。我已经在网上和书中看过这个例子,虽然它没有被描述为模板。这有点令人困惑,因为我没有使用模板关键字,在书中它们被描述为"参数化。"
2.。)从上面链接的网站...
模板参数可以是类型,值,符号或元组
所以在我的情况下,我的模板参数是一个符号。书中的例子使用了类型。
深入了解网站上的语言规范后发现,书中所涵盖的内容还有很多内容!
答案 1 :(得分:1)
或者你可以使用枚举来简化约束,使得错误的模板实例化是不可能的(即使在你的代码中模板约束完美地完成它)。例如:
enum rangeKind{training, input, target};
public struct DataRange(rangeKind Kind)
{
}
void main(string args[])
{
DataRange!(rangeKind.training) dr;
}