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.)

Reply via email to