$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Itay Maman (itay_maman_at_[hidden])
Date: 2002-08-01 00:59:03
Hi,
I feel that I didn't get the full notion of your suggestion, maybe a short formal description is needed. Anyway, based on your example ( y["b"] = "hello"; x["c"] = y;) I would suggest somethin like this:
struct LayeredContainer
{
    map<string, any> data_;
    any& operator[](const string& s)
    {
       string::size_type pos = s.find('.');
       if(pos == s.npos)
          return data_[s];
       any temp = data_[s.substr(0, pos)];
       if(LayeredContainer* next_p = any_cast<LayeredContainer>(&temp) )
         return (*next_p)[s.substr(pos+1, s.npos)];
       throw runtime_error("Wrong!");
    }
};
Generally speaking, I feel that a variant can replace boost.any in most cases where a generic container is needed. It does have its drawbacks (primarily: (1) heavier compile-time demands, and (2) the set of acceptable types is bounded), though. You can find previous stable versions in the file section.
-Itay.
----- Original Message ----- 
From: "Geoff Leyland" <geoff.leyland_at_[hidden]>
Newsgroups: gmane.comp.lib.boost.devel
Sent: Wednesday, July 31, 2002 1:46 PM
Subject: Re: Any, variant and more, and Sobol sequences
> Hi,
> 
> Sorry I didn't reply sooner, my presence near mail has been a bit patchy 
> for the last few days, and will continue to be so for a few more, but I 
> am definitely interested in any/variant.
> 
> On Samedi, juillet 27, 2002, at 10:27 , "Itay Maman" 
> <itay_maman_at_[hidden]> wrote:
> 
> > Consider this code:
> >
> >    map<string, any> x;
> >    x["a.b"] = 2.0;
> >    x["a.c.d"] = "hello";
> >
> >    if(string* p = any_cast<string>(&(x["a.c.d"]))
> >        cout << *p;
> >
> > Isn't it semantically equivalent to your code?
> 
> Yes, but I think I didn't explain myself very well, or that I've missed 
> some cunning ways of doing things.  What you've written works fine, and 
> would be both simpler than what I've done, and maybe faster, but
> 
> map<string, any> x, y;
> y["a"] = 2.0;
> y["b"] = "hello";
> x["c"] = y;
> 
> ends up with you having to go x["c"].be<map<string, any> >()["b"] to get 
> "hello" back, whereas I'd rather go x["c.b"] (and this is a case where 
> you really have to use the "be" or "any_cast", which you can avoid for 
> assignment and casts).  You could get over this by overloading the "=" 
> operator so that it tacked "c." onto the beginning of all the elements 
> of y and assigned them to x with full names.
> 
> Passing a const reference to part of x :
> 
> do_something(x["c"]);
> 
> would also be difficult - you could "find" "c." in x, and then make a 
> new map out of all subsequent things you iterated through that started 
> with "c.", but this would preclude the use of hash_maps (which never 
> seem to work for more than one compiler for me anyway, but surely will 
> one day)
> 
> passing a non-const reference would just get too tricky:
> 
> add_some_things_to_this_struct(x["c"]);
> 
> because you'd have to somehow recover the values back into x, or pass 
> copies of the elements (can many anys refer to the same holder?),
> 
> and when you started to use vector notation, and wanted equivalence 
> between
> 
> x["g[1]"];
> 
> and
> 
> x["g"][1]
> 
> you'd be all tied up.
> 
> So I think it's worth "interpreting" the "addresses" of the members, and 
> having a structure that contains structures, but I'd be very happy to 
> hear from anyone who can make my life simpler - not that the address 
> interpreting is very difficult either.
> 
> Do I take it from your mail that I should be looking at variant as the 
> future of any/variant?  Can I check it out of cvs?
> 
---------------------------------
Do You Yahoo!?
Yahoo! Health - Feel better, live better