Templates: Array slices not recognized

Chris via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Apr 18 06:46:19 PDT 2015


The following:

import std.stdio : writefln;
import std.range.primitives : isInputRange, hasLength;

void main() {
   size_t[] a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
   doSomething(a);  // works

   doSomething(a[0..5]);

// ---> Error: template slices.doSomething cannot deduce function 
from argument types !()(ulong[]), candidates are:
   // slices.d(11): slices.doSomething(R)(ref R r) if 
(isInputRange!R && hasLength!R)

   doSomething!(size_t[])(a[0..5]);
   // ---> Error: doSomething (ref ulong[] r) is not callable 
using argument types (ulong[])
}

void doSomething(R)(ref R r)
                 if (isInputRange!R && hasLength!R)  // etc..
{
   foreach (ref n; r) {
     writefln("%d * 2 = %d", n, n * 2);
   }
}

//EOF

a[0..5] is not recognized as size_t[]. If I give the compiler a 
hint with !(size_t[]), it complains again, i.e. I can not pass 
the slice as a reference.

A workaround is

size_t[] b = a[0..5];
doSomething(b);

However, this comes with a serious performance penalty in for 
loops (even if I predefine b and reuse it in the loop). 
to!(size_t[])(a[0..5]) is even worse.

Any thoughts or tips?


More information about the Digitalmars-d-learn mailing list