On 5/7/20 5:22 AM, learner wrote:
Good morning,
Is there a reason why std.variant.visit is not inferring pure?
```
void test() pure {
Algebraic!(int, string) alg;
visit!( (string) => 0, (int) => 0)(alg);
}
Error: pure function test cannot call impure function
test.visit!(VariantN!(16LU, int, string)).visit
```
Thank you
Because VariantN (the base of Algebraic) can literally hold anything, it
cannot be pure, @safe, nothrow, @nogc.
As others have recommended, I suggest using TaggedAlgebraic. I recently
have been using it to create an algebraic type to hold a MYSQL value, so
I can migrate the mysql-native library to be @safe (mysql-native
currently uses Variant for everything).
I added a special UDA to TaggedAlgebraic, so you can guarantee only
@safe calls are allowed (for instance, if it can hold a pointer and an
int, then opBinary!"+" can be marked as @safe if the operation fails
when it's a pointer).
TaggedAlgebraic could probably do the same for pure, but not sure about
nothrow and @nogc, since it uses exceptions when things aren't valid.
-Steve