2016-11-08 59 views
1

我想解析一些输入,如longstd::string(如果引用)。对此的合理解决方案是使用x3::variant<long, std::string>来存储数据。下面是一个简单的程序:Boost Spirit X3:将数据提取到x3 ::变体<...>始终为空

#include <iostream> 
#include <string> 

#include <boost/spirit/home/x3.hpp> 
#include <boost/spirit/home/x3/support/ast/variant.hpp> 

namespace x3 = boost::spirit::x3; 

const x3::rule<class number_tag, long> number = "number"; 
const auto number_def = x3::long_; 
BOOST_SPIRIT_DEFINE(number); 

const x3::rule<class string_tag, std::string> string = "string"; 
const auto string_def = x3::lexeme['"' >> *(x3::char_ - '"') >> '"']; 
BOOST_SPIRIT_DEFINE(string); 

using any_type = x3::variant<long, std::string>; 
const x3::rule<class any_tag, any_type> any = "any"; 
const auto any_def = number | string; 
BOOST_SPIRIT_DEFINE(any); 

int main() 
{ 
    const std::string src = "18"; 
    any_type result; 
    auto iter = src.begin(); 
    bool success = x3::phrase_parse(iter, src.end(), any, x3::space, result); 
    if (!success || iter != src.end()) 
     return 1; 
    else 
     std::cout << "Result: " << result << std::endl; 
} 

预期的结果是:

Result: 18 

然而,实际结果很简单:

Result: 

我在做什么错?升级版本是1.61。

回答

1

不能像这样打印变体。您必须将其传递给访问者。对于如(用于转换检查完成没有太大错误):

struct Visitor 
{ 
    using result_type = long; 

    result_type operator()(long v) const { return v; } 
    result_type operator() (const std::string& v) { return std::atol(v.c_str()); } 
}; 

,应该从你的代码调用,如:

if (!success || iter != src.end()) { 
     return 1; 
    } else { 
     Visitor v; 
     std::cout << "Result: " << boost::apply_visitor(v, result) << std::endl; 
    } 
+0

有趣...'运营商<<'的'正常提升: :变种'只是工作。 –