On Thursday, 20 May 2021 at 11:40:24 UTC, Ola Fosheim Grostad wrote:
>But delegates have to work without a GC too
Well they do... sort of.
You can always take the address of a struct member function and now you have your nogc delegate.
Of course the difficulty is the receiving function has no way to knowing if that void* it received is a struct or an automatically captured variable set or what.
And the capture list takes a little work but there's tricks like making it all in a struct.
I wrote about this not too long ago:
http://dpldocs.info/this-week-in-d/Blog.Posted_2021_03_01.html#tip-of-the-week
However the delegate itself is less useful than a functor or interface though unless you must pass it to existing code. And then unless it is a scope
receiver you're asking for a leak anyway again because of that void* being unknown to the caller (which is why this is possible at all, but also it leaves you a bit stuck).
It would be kinda cool if the compiler would magically pack small types into that void* sometimes. Since it is opaque to the caller it could actually pack in a captured int or two right there and be a by-value delegate.