Come posso estrarre doppie coppie provenienti da uno std :: string con lo Spirito Boost?

StackOverflow https://stackoverflow.com/questions/3666004

  •  01-10-2019
  •  | 
  •  

Domanda

Voglio analizzare una stringa con una sequenza di doppi coppie in uno std :: map con lo Spirito Boost.

adattato l'esempio http://svn.boost.org/ svn / boost / trunk / librerie / spirito / es / qi / key_value_sequence.cpp ma ho un problema con difining una corretta qi :: regola per la chiave e il valore:

template <typename Iterator>
struct keys_and_values : qi::grammar<Iterator, std::map<double, double> >
{
    keys_and_values()
      : keys_and_values::base_type(query)
    {
        query =  pair >> *(qi::lit(',') >> pair);
        pair  =  key >> value;

        key   =  qi::double_;
        value = +qi::double_;
    }

    qi::rule<Iterator, std::map<double, double>()>  query;
    qi::rule<Iterator, std::pair<double, double>()> pair;
    qi::rule<Iterator, std::string()>               key, value;
};

Non riesco a usare doppia () per la chiave e il valore delle regole e uno std :: string non può essere costruito da un doppio.

È stato utile?

Soluzione

Non sono sicuro perché non è possibile utilizzare chiave a doppia () e valore quando la vostra esigenza di uscita è

 map<double, double>.

Per quanto ho capito il problema sottostante codice dovrebbe risolverlo.

 template <typename Iterator>
 struct keys_and_values : qi::grammar<Iterator, std::map<double, double>() >
 {
     keys_and_values()
       : keys_and_values::base_type(query)
     {
         query =  pair >> *(qi::lit(',') >> pair);
         pair  =  key >> -(',' >> value);     // a pair is also separated by comma i guess

         key   =  qi::double_;
        value = qi::double_;    // note the '+' is not required here
     }

     qi::rule<Iterator, std::map<double, double>()>  query;
     qi::rule<Iterator, std::pair<double, double>()> pair;
     qi::rule<Iterator, double()>               key, value;    // 'string()' changed to 'double()'
 };

Il codice sopra analizza l'input di sequenza doppia 1323.323,32323.232,3232.23,32222.23 in

mappa [1323.323] = 32323.232

mappa [3.232,23] = 32.222,23

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top