Реализующий оператор деления

Я пишу простой калькулятор, используя повышение духа.

Я хочу, чтобы оператор деления генерировал исключение, если встречается нулевой знаменатель.

Я думаю в соответствии с

 term =
     factor                      [qi::_val = qi::_1]
     >> *(('*' >> factor         [qi::_val *= qi::_1])
     |
         ('/' >> factor  
        [qi::_val = boost::phoenix::if_else(
            qi::_1, 
            qi::_val / qi::_1, 
            /*ToDo some exception actor here*/)
        ])...

Тем не менее, чтобы это имело смысл, субъекту исключения не только нужно "лениво-бросать" "деление на ноль", но и неявный тип возвращаемого значения, совместимый с qi::_val, Вот где я застрял. Есть ли что-то в Фениксе, что я могу использовать здесь, или мне нужно привязать к функции, закодированной вручную?

1 ответ

Решение

Boost Phoenix позволяет группировать выписки. Скобки используются для этого. Это, наряду с boost::phoenix::throw_ позволяет писать

(boost::phoenix::throw_("division by zero"), qi::_1)

в вашем ToDo блок. qi::_1 не будет оцениваться, но (i) вы знаете, что оно будет оцениваться до 0, так как оно "провалит" if_else и (ii) имеет правильный тип.

Другие вопросы по тегам