On Tuesday, 31 December 2019 at 04:38:53 UTC, Daren Scot Wilson
wrote:
I'm needing to see more examples. It might have something to
do with the array I'm working with being inside a foreach loop.
My code looks like this, with the problematic line duplicated
to show some of the variations I tried:
import std.algorithm;
alias doo = ubyte;
struct Info
{
int x;
doo[NDOOS] doos; // NDOOS = 10
}
immutable int INFO = 100000;
Info[NINFOS] infos; // global array, used heavily.
float foo_function(doo important_d) {
...
foreach (info; infos) {
int i = info.doos.index(important_d);
// #1
int i = info.doos.countUntil(d => d == important_d);
// #2
int i = info.doos.countUntil!(d => d == important_d);
// #3
int i = countUntil(d => d == important_d, info.doos);
// #4
int i = countUntil!(d => d == important_d)(info.doos);
// #5
if (i>=0) { // assuming -1 represents value not found
... do stuff with i ...
}
}
...
}
All the lines shown give me
"template ... cannot deduce function from argument types..."
but one time I got, but cannot reproduce now, the error
"Error: template instance countUntil!((d) => d ==
important_d, doos) has no value"
countUntil operates on ranges, and static arrays aren't ranges.
To get a range from a static array, you have to slice it with the
`[]` operator:
int i = info.doos[].countUntil(important_d);
(Why can't static arrays be ranges? Because ranges can shrink,
via popFront, but a static array can never change its length.)