On Friday, 10 May 2024 at 00:18:16 UTC, Andy Valencia wrote:
>tst7.d(6): Error: cannot implicitly convert expression e in this.members
of type bool*
to bool
tst7.d(15): Error: template instance tst7.Foo!uint
error instantiating
I'm getting this for this bit of source (trimmed from the bigger code). I switched to this.members.get(e, false) and that works fine, but I'm still curious:
struct Foo(T) {
bool[T] members;
bool
has(T e) {
return (e in this.members);
}
}
void
main()
{
import std.stdio : writeln;
auto t = Foo!uint();
writeln(t.has(123));
}
Yes. The reason for this is that it avoids having to essentially do the same check twice. If in
returned a bool instead of a pointer, after checking for whether the element exists (which requires searching for the element in the associative array), you'd then have to actually get it from the array, which would require searching again. Returning a pointer to the element if it exists (or null
if it doesn't) cuts this down to 1 operation.