There is a weird rule on how compiler treats alias this for the N
and S types bellow.
As you can see, somehow S losses it's type and ends up a plain
string withing the Algebraic type. I would expect that all types
should be the treated the same, why a string alias will be
different then a bool or a double?
int main(string[] argv)
{
import std.variant : Algebraic;
struct N { double val; alias val this; }
struct S { string val; alias val this; }
alias T = Algebraic!(N, S);
pragma(msg, T.AllowedTypes); // prints (N, string)??
T t = N(1.0);
assert(t.get!N == 1.0); // works
// t = 0.4; // fails, OK, variant.d(586): Error: static assert
"Cannot store a double in a VariantN!(8u, N, S). Valid types are
(N, string)"
// t = S("foo"); // this fails, why? Error: static assert
"Cannot store a S in a VariantN!(8u, N, S). Valid types are (N,
string)"
t = "bar"; // this works... why?
// assert(t.get!S == "bar"); //this fails Variant: attempting to
use incompatible types immutable(char)[] and main.main.S at
std\variant.d(1475)
assert(t.get!string == "bar"); // works, why?
return 0;
}