As std.variant.Algebraic implements a bounded discriminated union, it should allow for duplicate types. i.e.
alias Algebraic!(string,string) A;
// Construction using: this(T)(T value, size_t id)
A a0 = A("First" ,0);
A a1 = A("Second",1);
// The type's id should be assessable by an ID member function that returns
// a size_t
switch(a0.id) {
case 0:
// The first int type
break;
case 1:
// The second int type
break;
default:
break;
}
// Similar to std.typecons.Tuple, member functions following the format of _#
// should provide a streamlined way of testing the ID and retrieving
// the Algebraic's value
assert(a0._0 == "First");
// Which is equivalent to
enforce(a0.id == 0);
assert(a0.get!string == "First");
// Similar to actual unions and std.typecons.Tuple, named members should be
// supported. Assignment to named members is allowed i.e.
alias Algebraic!(int,"x", int,"y") B;
B b = B(10,0);
assert(b.id == 0);
assert(b._0 == 10);
assert(b.x == 10);
b.y = 5;
assert(b.id == 1);
assert(b._1 == 5);
assert(b.y == 5);
Comment #1 by tetyys — 2017-04-09T07:41:35Z
> As std.variant.Algebraic implements a bounded discriminated union, it should allow for duplicate types
Algebraic data type restricts to a closed set of possible types, how is it gonna restrict it to same type twice? I think the actual bug here is that Algebraic doesn't say anything when you pass two same types into it. But it still restricts storage to that one type normally.
Comment #2 by robert.schadek — 2024-12-01T16:15:51Z