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