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?
答案 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是否可行。