
Matias Capeletto wrote:
I want to use this with my bimaps (I will add a section Bimap and Boost.Xpressive to my Bimap and Boost.? docs) but I do not know the correct approach. Because bimaps have other constraints than maps, I can not provide operator[] for insertion. I have to use the usual insert.
This works as you said: (operator[] is provided for this bimap because list_of collection type does not impose additional constraints)
---------------------------------------------------------------------------- typedef bimap< std::string, list_of< int > > bm_type; bm_type bm;
std::string str("aaa=>1 bbb=>23 ccc=>456"); sregex pair = ( (s1= +_w) >> "=>" >> (s2= +_d) ) [ xp::ref(bm.left)[ s1 ] = as<int>(s2) ]; ----------------------------------------------------------------------------
But when operator[] is not present I have tried to use insert but failed. Being able to parse a file is a nice addition to bimap docs. I know I have to wait to your docs but I want to know now :) Can you help me?
Sure. What is the signature of bimap::insert? In xpressive/regex_action.hpp, there is a lazy insert function object that can be used to insert stuff into sequences, strings and associative containers. For instance, my example could have been written as: sregex pair = ( (s1= +_w) >> "=>" >> (s2= +_d) ) [ insert(ref(result), make_pair(s1, as<int>(s2))) ]; which is also equivalent, via some Proto magic, to: sregex pair = ( (s1= +_w) >> "=>" >> (s2= +_d) ) [ ref(result)->*insert(make_pair(s1, as<int>(s2))) ]; But be sure to sync up. I just had to add xpressive::make_pair. :-) -- Eric Niebler Boost Consulting www.boost-consulting.com