2010-09-08 3 views
0

Je veux analyser une chaîne avec une séquence de doubles paires dans une carte std :: map avec Boost Spirit.Comment puis-je extraire des doubles paires d'une chaîne std :: avec Boost Spirit?

Je me suis adapté l'exemple de http://svn.boost.org/svn/boost/trunk/libs/spirit/example/qi/key_value_sequence.cpp mais j'ai un problème avec difining un bon qi :: règle clé et la valeur:

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; 
}; 

Je ne peux pas utiliser le double() pour la clé et Les règles de valeur et une chaîne std :: ne peuvent pas être construites à partir d'un double.

Répondre

0

Je ne sais pas pourquoi vous ne pouvez pas utiliser le double() clé et la valeur lorsque votre exigence de sortie est

map<double, double>. 

Si je comprends bien le problème du code ci-dessous doit résoudre.

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()' 
}; 

Le code ci-dessus analyse l'entrée de la double séquence 1323.323,32323.232,3232.23,32222.23 en

carte [1323,323] = 32323,232

carte [3232,23] = 32222,23

+0

Oui, ce travaux. Merci! –

Questions connexes