[spirit] reading vector of string

Hi there, can I use push_back_a with std::vector<std::string>? I want something like this: std::vector< std::string > lines; rule<> l_entry = blanks_p >> *print_p[push_back_a( lines )] >> blanks_p >> eol_p; Regards, Christian

On Wed, Jul 16, 2008 at 11:30:46AM -0400, Christian Henning wrote:
Hi there, can I use push_back_a with std::vector<std::string>? I want something like this:
std::vector< std::string > lines; rule<> l_entry = blanks_p >> *print_p[push_back_a( lines )] >> blanks_p >> eol_p;
Since your rule probably returns an iterator pair, you need to create the std::string first. To this end, you can leverage phoenix to create a lazy functor [1], e.g. struct push_back_impl { template <typename Container, typename Item> struct result { typedef void type; }; template <typename Container, typename Item> void operator()(Container& c, Item const& item) const { c.push_back(item); } }; function<push_back_impl> const push_back = push_back_impl(); Thereafter, you can use the functor as follows: *print_p[push_back(var(lines), construct_<std::string>(arg1, arg2))] Another option would be to create a rule that returns a std::string and instead of a char_t iterator pair. In this case, you have to change the scanner context. Unfortunately, I have not yet experimented with this option, but I assume it's a more convenient solution than the one above. Matthias [1] http://www.boost.org/doc/libs/1_35_0/libs/spirit/doc/phoenix.html -- Matthias Vallentin vallentin@icsi.berkeley.edu http://matthias.vallentin.cc pgp: 0x37F34C16
participants (2)
-
Christian Henning
-
Matthias Vallentin