Nesting Variants

Timothee Cour thelastmammoth at gmail.com
Thu Jun 13 14:21:27 PDT 2013


On Sun, May 19, 2013 at 4:31 PM, Wyatt <wyatt.epp at gmail.com> wrote:

> I'm trying to use Variants and ran into the following sort of situation:
>
> //Using DMD 2.062
> import std.stdio;
> import std.variant;
>
> void main(){
>         int key = 1;
>         Variant[] one;
>         Variant[] ender;
>         one = new Variant[](1);
>         ender = new Variant[](1);
>
>         //This bails:
>         //std.variant.**VariantException at std/variant.**d(1224): Variant:
> attempting to use incompatible types int and std.variant.VariantN!(32LU).*
> *VariantN
>         ender[0] = one;
>         ender[0][0] = key;
>         writeln(ender[0][0]);
>
>         //Also bails only rather than int, it's
> std.variant.VariantN!(32LU).**VariantN*:
>         //ender[0][0] = new Variant(key);
>
>         //This works fine:
>         //one[0] = key;
>         //ender[0] = one;
>         //writeln(ender[0][0]);
> }
>
> The long and short of it seems to be that you can't (easily) assign to an
> element of a Variant array within a Variant array but you CAN access it as
> long as you build the whole thing upside-down.  Can anyone shed some light
> on why this is?  Am I just missing some not-completely-obvious step?
>
> Oh, I should probably mention I was originally using associative arrays,
> so I thought maybe I'd hit one of the bugs related to that. But as you can
> see, it's happening even with ordinary arrays.
>



I think I have a solution for you:

see thread:
http://forum.dlang.org/post/mailman.1054.1371029915.13711.digitalmars-d@puremagic.com


 <https://github.com/timotheecour/dtools/blob/master/dtools/util/variant_nested.d>
>
> https://github.com/timotheecour/dtools/blob/master/dtools/util/variant_nested.d
>        auto
> d=variantTupleNamed("a",1,"b","foo","c",variantTuple(1,2.2,"three"));
> d["a"]=2;
> auto v=d["c"][0].get!int;//can coerce to int
> v+=3;
> d["c"][0]="other1";//can access nested type
> d["a"]="other2";//can change type
> d["a"]=variantTuple(0.0,'e');
> d["a"]=10;
> d["a"]+=2; //read-modify-write works, unlike std.variant : 'Due to
> limitations in current language, read-modify-write operations op= will not
> work properly'
> assert(d.text==`["a":12, "b":foo, "c":[other1, 2.2, three]]`);
> Pending DIP32 (Uniform tuple syntax), this could improve to:
>        auto d=variant( {a=1,b="foo", c={1,2.2,"three"}} );
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20130613/18d8ac0c/attachment.html>


More information about the Digitalmars-d-learn mailing list