结构表达式参数与类型参数

时间:2014-10-17 03:27:12

标签: d

我在输入范围内迭代自定义容器,该容器包含需要保持与输入和目标精确配对的数据点。我需要不同的范围来返回训练数据(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。

我甚至不知道为什么我会这样做,回头看它我不知道为什么会这样。谁知道我错过了什么?这记录在哪里?

2 个答案:

答案 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;
}