Hi all,
maybe I misunderstand something but having this:

´´´
import std.experimental.all;

static assert(isIterable!S);

void main()
{
    S s;
    s.each!(el => el.writeln);
}

struct S
{
    private Nullable!uint member = 0;
    Nullable!uint front() @nogc { return member; }
    //void popFront(){} // not implementable.
    //bool empty(){} // not implementable
Nullable!uint successor(uint current) @nogc { return Nullable!uint.init; }

    /**
    the opApply method grants the correct foreach behavior
    */
int opApply(scope int delegate(ref uint) /*@nogc*/ operations) //@nogc
    {
        int result;

for(auto leading = front; !leading.isNull; leading = successor(leading.get))
        {
            result = operations(leading.get);

            if(result)
            {
                break;
            }
        }
        return result;
    }
}
´´´

Everything works fine, before I try to use the opApply function inside a @nogc function.

If I do, compiler complains, that opApply is not marked as @nogc. Ok. If I try to mark opApply @nogc, I would have to mark operations delegate also as @nogc, but I can't do this, as I do not know a priori, how it will be used.

Now, as I learned at some point, a possibility would be, to templatify the function, as the compiler can then derive, if @nogc apply or not.
But if I write
´´´
int opApply()(...){...}
´´´
Then the static assert from above refuses to compile.

So... how to solve this case?

Reply via email to