2016-08-07 14 views
4

Ich versuche Boost.Sprit x3 zu verwenden, um eine Sequenz von zwei Ganzzahlen in eine std::pair<int, int>. Gemessen an der Dokumentation sollte der folgende Code kompiliert:Übereinstimmend eine Sequenz von zwei Ganzzahlen in ein `std :: pair <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


Es ist jedoch nur die erste ganze Zahl übereinstimmt. Wenn ich std::pair<int, int> result; zu int result; ändere und dann result drucke, erhalte ich 1 als meine Ausgabe.

Warum passiert das? Ist int_ >> int_ nicht die richtige Methode zum Definieren eines Parsers, der entspricht (und als Attribute festlegt) zwei Ganzzahlen?

+5

Es sieht so aus, als müssten Sie den relevanten Boost.Fusion Header einfügen, der 'std :: pair' anpasst. –

+0

@ T.C .: Ja, das hat das Problem gelöst. Vielen Dank! Poste deinen Kommentar als Antwort und ich akzeptiere ihn. –

Antwort

5

Eigentlich @ T.C. Der Kommentar von einschließlich <boost/fusion/adapted/std_pair.hpp> ist nur genug, um den Compiler zum Schweigen zu bringen, nicht um Ihre Zeichenfolge richtig zu analysieren. Ich hatte auch ein x3::phrase_parse() die x3::parse() zu ändern, die über Leerzeichen überspringen:

#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

Bitte beachte, dass ich auch Ihre using namespace boost::spirit::x3 mit einem Namespace alias ersetzt. Dies wird die Lesbarkeit behalten, wird aber verhindern, dass Sie die riesige Menge an Boost.Spirit-Symbolen in Ihren Code stecken.