过滤带索引的容器元组

时间:2015-11-17 13:19:31

标签: d

template tupIndexToRange(alias Tup, Indices...){
  import std.meta;
  static if(Indicies.length == 0){
    alias tupIndexToRange = AliasSeq!();
  }
  else{
    alias tupIndexToRange = AliasSeq!(Tup[ Indices[0] ][], tupIndexToRange!(Tup,Indices[1..$]));
  }
}

void main{
  alias Integrals = AliasSeq!(Array!int, Array!float, Array!double);
  Integrals integrals;

  alias IntegralRange = tupIndexToRange!(integrals,0,1);
}

我想实现类似的目标

auto range = zip(tupIndexToRange!(integrals,0,1));

我认为主要问题是Tup[ Indices[0] ]不起作用,对我而言应该扩展到AliasSeq!(itegrals[0][],integrals[1][]);

  

source / app.d(108,22):错误:inout方法   std.container.array.Array!int.Array.opIndex不能使用a调用   mutable object source / app.d(108,22):错误:inout方法   std.container.array.Array!int.Array.opIndex不能使用a调用   mutable object source / app.d(108,22):错误:只允许一个索引   index int source / app.d(108,22):错误:只允许一个索引编制索引   int source / app.d(108,54):错误:模板实例   app.main.tupIndex!(__ integrals_field_0,1)错误实例化   source / app.d(108,54):从这里实例化:   tupIndex!(__ integrals_field_0,0,1)source / app.d(108,54):
  从这里实例化:tupIndex!(__ integrals_field_0,   __integrals_field_2,0,1)source / app.d(155,3):从这里实例化:tupIndex!(__ integrals_field_0,__ integrals_field_1,   __integrals_field_2,0,1)dmd失败,退出代码为1

这大致是我想要实现的目标

  alias Integrals = AliasSeq!(Array!int, Array!float, Array!double);
  Integrals integrals;
  integrals[0].insertBack(1);
  integrals[1].insertBack(2);
  integrals[2].insertBack(3);

  auto range = zip(tuple(integrals[0][],integrals[1][]).expand);
  writeln(range);
  foreach(e;range){
    writeln("element: ",e);
  }

但我不是auto range = zip(tuple(integrals[0][],integrals[1][]).expand);而是希望它是通用auto range = zip(tupIndexToRange!(integrals, AliasSeq!(0, 1)).expand);

也许我需要使用mixins?

1 个答案:

答案 0 :(得分:0)

我能够通过使用mixins来解决这个问题。

string tupleToRange(Indicies...)(string name){
  string r = "zip(";
  foreach(i,idx;Indicies){
    r ~= name ~ "[" ~ idx.stringof ~"][]";
    if(i < Indicies.length -1){
      r~=",";
    }
  }
  r~=")";
  return r;
}

void main()
{
  import std.meta;
  import std.range;
  import std.container;
  import std.stdio;

  alias Integrals = AliasSeq!(Array!int, Array!float, Array!double);
  Integrals integrals;
  integrals[0].insertBack(1);
  integrals[1].insertBack(2);
  integrals[2].insertBack(3);

  auto range = mixin(tupleToRange!(0,1)("integrals"));
  writeln(range);
  foreach(e;range){
    writeln("element: ",e);
  }
}

但我仍然想知道没有mixin是否可行。