Access to intersection fields of an algebraic data type
sighoya
sighoya at gmail.com
Sat Jan 19 18:08:49 UTC 2019
On Saturday, 19 January 2019 at 17:51:58 UTC, Meta wrote:
> On Saturday, 19 January 2019 at 17:40:53 UTC, sighoya wrote:
>> Is there a solution for the following problem:
>>
>> import std.variant : Algebraic;
>>
>> struct A
>> {
>> int a=2;
>> }
>>
>> struct B
>> {
>> int a=2;
>> };
>>
>> void main()
>> {
>> Algebraic!(A,B) c=A();
>> writeln(c.a);
>> return;
>> }
>>
>> Error: no property a for type VariantN!(4LU, A, B)
>
> You want the untyped version of std.variant.visit:
>
> writeln(c.visit!(aOrB => aOrB.a));
Thanks @Meta,
With the help of dlang's UFCS, we can rewrite it more
idiomatically as:
import std.variant : Algebraic;
struct A
{
int a=2;
}
struct B
{
int a=2;
};
int a(Algebraic!(A,B) c)
{
return cast(int)(visit!((c)=>c.a)(c));
}
void main()
{
Algebraic!(A,B) c=A();
writeln(c.a);
return;
}
More information about the Digitalmars-d
mailing list