Проблема повышения грамматики - PullRequest
0 голосов
/ 27 мая 2018

У меня есть простой код для разбора некоторых сообщений, как показано ниже,

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_]]

* 1006.* Когда я попытался выполнить рефакторинг ниже,
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?

1 Ответ

0 голосов
/ 27 мая 2018

Вы не можете безопасно использовать auto с выражениями анализатора духов.См., Например, повышение духа Ошибка Q2 V2, связанная с уровнем оптимизации

Однако, это также выглядит как

...