C++ 提升精神将u分配给*自定义点
我试图了解boost spiritC++ 提升精神将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,第二个
如何将\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