2016-08-07 5 views
4

J'essaie d'utiliser Boost.Sprit x3 pour faire correspondre une séquence de deux entiers dans un std::pair<int, int>. A en juger par la documentation, le code suivant doit compiler:Correspondance d'une séquence de deux entiers dans une paire `std :: <int, int>`


#include <string> 
#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 

int main() 
{ 
    using namespace boost::spirit::x3; 

    std::string input("1 2"); 
    std::pair<int, int> result; 
    parse(input.begin(), input.end(), int_ >> int_, result); 
} 

melpon.org link


Cependant, il correspond seulement au premier entier. Si je change std::pair<int, int> result; en int result; puis que j'imprime result, j'obtiens 1 comme sortie.

Pourquoi cela se produit-il? int_ >> int_ n'est pas la bonne façon de définir un analyseur qui correspond à (et définit comme attributs) deux entiers?

+5

Il semble que vous ayez besoin d'inclure l'en-tête Boost.Fusion approprié qui adapte 'std :: pair'. –

+0

@ T.C .: oui, cela a résolu le problème. Merci! Postez votre commentaire en réponse et je l'accepterai. –

Répondre

5

En fait, @ T.C. Le commentaire d'inclure <boost/fusion/adapted/std_pair.hpp> est seulement suffisant pour faire taire le compilateur, pas pour analyser correctement votre chaîne. Je devais aussi changer le x3::parse() pour une x3::phrase_parse() qui saute sur les espaces:

#include <iostream> 
#include <string> 
#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 
#include <boost/fusion/adapted/std_pair.hpp> 

int main() 
{ 
    namespace x3 = boost::spirit::x3; 

    std::string input("1 2"); 
    std::pair<int, int> result; 
    auto ok = x3::phrase_parse(input.begin(), input.end(), x3::int_ >> x3::int_, x3::space, result); 
    std::cout << std::boolalpha << ok << ": "; 
    std::cout << result.first << ", " << result.second; 
} 

Live Example

Notez que j'ai aussi remplacé votre using namespace boost::spirit::x3 avec un alias d'espace de noms . Cela gardera la lisibilité mais empêchera de déverser l'énorme quantité de symboles Boost.Spirit dans votre code.