【发布时间】:2018-05-27 05:52:37
【问题描述】:
我有一些简单的代码来解析一些味精,如下所示,
if (msgtype == BATSAddOrderMsg::longMsgCode)
m_wire_msg = ( p_ts >> qi::char_(BATSAddOrderMsg::longMsgCode)
>> p_orderId
>> qi::char_(BATSAddOrderMsg::sideFlag)
>> p_shares
>> qi::as_string[qi::repeat(6)[qi::char_]]
>> m_price
>> qi::char_(BATSAddOrderMsg::displayFlag)
>> qi::as_string[qi::repeat(4)[qi::char_]] )
[qi::_val = phi::construct<BATSAddOrderMsg>(
qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, qi::_9)];
else if (msgtype == BATSAddOrderMsg::shortMsgCode)
m_wire_msg = ( p_ts >> qi::char_(BATSAddOrderMsg::shortMsgCode)
>> p_orderId
>> qi::char_(BATSAddOrderMsg::sideFlag)
>> p_shares
>> qi::as_string[qi::repeat(6)[qi::char_]]
>> m_price
>> qi::char_(BATSAddOrderMsg::displayFlag) )
[qi::_val = phi::construct<BATSAddOrderMsg>(
qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, "")];
在上面,长味精类型只是短味精类型加上一个额外的字段qi::as_string[qi::repeat(4)[qi::char_]]
当我尝试重构为以下内容时,
auto shared = p_ts >> qi::char_(BATSAddOrderMsg::longMsgCode)
>> p_orderId
>> qi::char_(BATSAddOrderMsg::sideFlag)
>> p_shares
>> qi::as_string[qi::repeat(6)[qi::char_]]
>> m_price
>> qi::char_(BATSAddOrderMsg::displayFlag);
if (msgtype == BATSAddOrderMsg::longMsgCode)
m_wire_msg = shared >> qi::as_string[qi::repeat(4)[qi::char_]] )
[qi::_val = phi::construct<BATSAddOrderMsg>(
qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, qi::_9)];
else if (msgtype == BATSAddOrderMsg::shortMsgCode)
m_wire_msg = shared[qi::_val = phi::construct<BATSAddOrderMsg>(
qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, "")];
代码可以编译,但是当我运行单元测试时,它会因运行时异常而死。
有人知道Boost Spirit为什么会出现这种行为吗?
【问题讨论】:
标签: c++ boost boost-spirit boost-spirit-qi