d - How to create a tuple of ranges? -
template tupindextorange(alias tup, indicies...){ import std.meta; import std.typecons; static if(indicies.length == 0){ enum tupindextorange = tuple(); } else{ enum tupindextorange = tuple(tup[ indicies[0] ][], tupindextorange!(tup,indicies[1..$])); } } void main(){ alias integrals = aliasseq!(array!int, array!float, array!double); tuple!integrals integrals; integrals[0].insertback(1); integrals[1].insertback(2); integrals[2].insertback(3); auto t = tupindextorange!(integrals, 0, 1, 2); auto r = zip(t.expand); }
err:
source/app.d(119,34): error: variable integrals cannot read @ compile time source/app.d(119,33): called here: tuple(integrals.__expand_field_2.opslice(), tuple()) source/app.d(119,56): error: template instance app.main.tupindextorange!(integrals, 2) error instantiating source/app.d(119,56): instantiated here: tupindextorange!(integrals, 1, 2) source/app.d(219,12): instantiated here: tupindextorange!(integrals, 0, 1, 2)
i assume error appears because trying access range @ compile time? how tell d need access range @ run time?
this tupindextorange
should do:
auto t = tuple(integrals[0][], integrals[1][], integrals[2][]);
how tell d need access range @ run time?
by passing runtime parameter:
template tupindextorange(indicies...) { auto tupindextorange(t)(t tup) { static if(indicies.length == 0){ return tuple(); } else{ return tuple(tup[ indicies[0] ][], .tupindextorange!(indicies[1..$])(tup).expand); } } }
two things note:
the function nested in template allows specify indices , not type. if
auto tupindextorange(t, indices)(t tup)
, woul have provide type explicitly.we recurse calling
.tupindextorange
rathertupindextorange
, want recurse via template in outer scope, not nested function.
Comments
Post a Comment