parameter pack to inputRange
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun May 8 16:49:40 PDT 2016
On 05/08/2016 04:48 PM, Erik Smith wrote:
> On Sunday, 8 May 2016 at 22:37:44 UTC, Dicebot wrote:
>> On Sunday, 8 May 2016 at 14:11:31 UTC, Ali Çehreli wrote:
>>> E front() {
>>> final switch (index) {
>>> /* static */ foreach (i, arg; Args) {
>>> case i:
>>> return arg;
>>> }
>>> }
>>> }
>>
>> AFAIK, this will do funny things with referencing stack if arguments
>> are variables and not literals.
>
> Thanks! The static array version works for me too. It would be good to
> understand more about what is going on. It looks like the cost of the
> static array is an extra copy for each element. Maybe there is still a
> way to avoid that.
>
I had to change one line of your test code. Dicebot's code work with it:
auto toInputRange (T...) (T args) @nogc
{
import std.traits : CommonType;
alias E = CommonType!T;
struct Range
{
E[T.length] args;
size_t index;
E front () { return args[index]; }
void popFront () { ++index; }
bool empty () { return index >= args.length; }
}
Range range;
foreach (i, ref arg; args)
range.args[i] = arg;
return range;
}
static void foo(Args...)(Args args) {
import std.container.array;
auto array = Array!int(toInputRange(args)); // <-- HERE
foreach(a; array) {
import std.stdio : writeln;
writeln("e: ", a);
}
}
void main ( )
{
import std.stdio;
writeln(toInputRange(1, 2, 3));
foo(1,2,3);
}
It used to be
toInputRange!(args)
Ali
More information about the Digitalmars-d-learn
mailing list