www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Access to intersection fields of an algebraic data type

reply sighoya <sighoya gmail.com> writes:
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)
Jan 19 2019
next sibling parent reply Meta <jared771 gmail.com> writes:
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));
Jan 19 2019
parent sighoya <sighoya gmail.com> writes:
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; }
Jan 19 2019
prev sibling parent Nicholas Wilson <iamthewilsonator hotmail.com> writes:
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)
Try using http://code.dlang.org/packages/taggedalgebraic I find it much better.
Jan 19 2019