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