C++ 提升精神将u分配给*自定义点

C++ 提升精神将u分配给*自定义点,c++,boost,boost-spirit,boost-spirit-qi,C++,Boost,Boost Spirit,Boost Spirit Qi,我试图了解boost spirit如何将\u分配给*自定义点 下面是我正在使用的一个示例: 我在语法规则中有一个解析器: int\u>>lit(':')>>char 我想把结果放在这个结构中: struct IntAndChar{ int i; 字符c; }; (这只是使用定制点的一个示例,因此我不会使用BOOST\u FUSION\u ADAPT\u STRUCT或语义操作。) 我想我可以定义一个专门化assign_to_attribute_from_value,但我只能这样得到int,第二个

我试图了解boost spirit
如何将\u分配给*
自定义点

下面是我正在使用的一个示例:

我在语法规则中有一个解析器:

int\u>>lit(':')>>char

我想把结果放在这个结构中:

struct IntAndChar{
int i;
字符c;
};

(这只是使用定制点的一个示例,因此我不会使用
BOOST\u FUSION\u ADAPT\u STRUCT
或语义操作。)

我想我可以定义一个专门化
assign_to_attribute_from_value
,但我只能这样得到int,第二个元素被删除


有人能给我一个提示,让我了解它是如何工作的吗?

您不想将其分配给属性。相反,您希望将
boost::fusion::vector2
转换为
IntAndChar

因此,让我们先告诉spirit我们的类型不是容器:

template<>
struct is_container<IntAndChar, void> : mpl::false_ { };
印刷品:

Parse success: 123, a
Parse success: -4, q
当然,这种方法需要您详细说明
boost::fusion::vector2
,这既繁琐又容易出错

2.使用
qi::attr\u cast
您可以使用
qi::attr\u cast
触发转换:

qi::rule<It, IntAndChar(), qi::space_type> rule = qi::attr_cast<IntAndChar, boost::fusion::vector2<int, char> >(qi::int_ >> ':' >> qi::char_);
// using deduction:
qi::rule<It, IntAndChar(), qi::space_type> rule = qi::attr_cast<IntAndChar>(qi::int_ >> ':' >> qi::char_);
// using even more deduction:
qi::rule<It, IntAndChar(), qi::space_type> rule = qi::attr_cast(qi::int_ >> ':' >> qi::char_);
印刷品

Parse success: 123, a
Parse success: -4, q


(除非你想把
IntAndChar
当作一个容器,这是另一回事)

现在更清楚了。而且效果很好。谢谢!
qi::rule<It, IntAndChar(), qi::space_type> rule = qi::attr_cast<IntAndChar, boost::fusion::vector2<int, char> >(qi::int_ >> ':' >> qi::char_);
// using deduction:
qi::rule<It, IntAndChar(), qi::space_type> rule = qi::attr_cast<IntAndChar>(qi::int_ >> ':' >> qi::char_);
// using even more deduction:
qi::rule<It, IntAndChar(), qi::space_type> rule = qi::attr_cast(qi::int_ >> ':' >> qi::char_);
qi::rule<It, IntAndChar(), qi::space_type> rule = qi::attr_cast(qi::copy(qi::int_ >> ':' >> qi::char_));
int main() {
    using It = std::string::const_iterator;

    for (std::string const input : { "123:a", "-4 :   \r\nq" }) {
        It f = input.begin(), l = input.end();
        IntAndChar data;

        bool ok = qi::phrase_parse(f, l, qi::attr_cast(qi::copy(qi::int_ >> ':' >> qi::char_)), qi::space, data);

        if (ok)     std::cout << "Parse success: " << data.i << ", " << data.c << "\n";
        else        std::cout << "Parse failure ('" << input << "')\n";
        if (f != l) std::cout << "Remaining unparsed input: '" << std::string(f, l) << "'\n";

    }
}
Parse success: 123, a
Parse success: -4, q