首页 文章

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

提问于
浏览
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"));

我一直在读Alexandrescu的“D编程语言”,我找到了表格的参数化结构

struct S(T){...} // or
struct S(T[]){...}

但是这些采用类型参数,而不是像我这样的表达式能够在dlang.org上找到带参数化类型的任何类似示例 .

这编译并适用于DMD 2.066和GDC 4.9.0 .

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

2 回答

  • 2

    或者,您可以使用枚举来简化约束,从而无法进行错误的模板实例化(即使在您的代码中模板约束完美地完成) . 例:

    enum rangeKind{training, input, target};
    public struct DataRange(rangeKind Kind)
    {
    }
    
    void main(string args[])
    {
        DataRange!(rangeKind.training) dr;
    }
    
  • 1

    好的,我找到了答案 . 虽然这没有在任何教程或书中的任何地方特别提及或描述,但最终我能够在http://dlang.org.template.html找到它 . 基本上这里有两件事 .

    1.)虽然我的代码说struct,但这实际上是一个模板(导致结构) . 我已经在网上和书中看过这个例子,虽然它没有被描述为模板 . 这有点令人困惑,因为我没有使用模板关键字,在书中它们被描述为“参数化” .

    2.)从上面链接的网站...

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

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

    深入研究网站上的语言规范可以发现,书中所涵盖的内容还有很多内容!

相关问题