How to construct a tree data structure with differently static nodes types

Max Haughton maxhaton at gmail.com
Mon Nov 23 01:24:54 UTC 2020


On Monday, 23 November 2020 at 01:20:04 UTC, data pulverizer 
wrote:
> Hi all,
>
> I am trying to construct a tree data structure composed of 
> differently (statically) typed nodes. The basic case is a 
> binary tree. So you have a node like:
>
> ```
> struct Node(T)
> {
>   T value;
>   Node* next;
>   Node* prev;
> }
>
> void main()
> {
>   auto x = Node!(int)(2);
>   auto y = Node!(double)(3.2);
>   x.next = &y; //gives error
> }
> ```
> Error: cannot implicitly convert expression & y of type 
> Node!double* to Node!int*
>
> So implicity Node!(T) will produce an object with prev, and 
> next type Node!(T)*. But once I give them different types:
>
> ```
> struct Node(T, P, N)
> {
>   T value;
>   Node!(P...)* prev;
>   Node!(N...)* next;
> }
> ```
>
> I can no longer specify the types at all, they become 
> circularly referenced. Would appreciate the solution to this.
>
> Many thanks.

If you want to keep things simple, use OOP (classes).

If you need to use structs, the "sumtype" may be just what you 
need (it's a bit more lightweight than std.algebraic in the 
standard library). If you want to implement this yourself then 
you need to write something called a tagged union.


More information about the Digitalmars-d-learn mailing list